Linq Puzzle: Как мне преобразовать этот foreach в синтаксис linq? - PullRequest
2 голосов
/ 07 сентября 2010
List<string> nameSpaceSuffixes = GetSuffixes();

foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            foreach(var suffix in nameSpaceSuffixes)
            {
                if (assembly.GetName().Name.EndsWith(suffix))
                    Register(container, assembly, suffix);
            }
        }

Ответы [ 2 ]

6 голосов
/ 07 сентября 2010

как выражение запроса:

var query = from assembly in AppDomain.CurrentDomain.GetAssemblies()
            from suffix in namespaceSuffixes
            where assembly.GetName().Name.EndsWith(suffix)
            select new { assembly, suffix };

foreach (var result in query)
{
    Register(container, result.assembly, result.suffix);
}

Я не пошел по пути использования Ани List<T>.ForEach - лично я предпочитаю использовать нормальный оператор foreach. LINQ отлично подходит для декларативных запросов; foreach - это Годо для обязательных действий, предпринимаемых для каждого элемента.

Обратите внимание, что мое выражение запроса почти эквивалентно точечной записи Ани; компилятор C # будет использовать немного другую перегрузку SelectMany, вот и все. В этом частном случае я думаю, что выражение запроса легче понять; в более простых случаях я предпочитаю точечные обозначения.

1 голос
/ 07 сентября 2010

Это может быть не самым эффективным, но:

 AppDomain.CurrentDomain
          .GetAssemblies()
          .SelectMany(assembly => nameSpaceSuffixes.Select(suffix =>
                                  new { Assembly = assembly, Suffix = suffix }))   
          .Where(anon => anon.Assembly.GetName().Name.EndsWith(anon.Suffix))       
          .ToList()
          .ForEach(anon => Register(container, anon.Assembly, anon.Suffix);
...