Linq Puzzle:如何将这个foreach转换为linq语法?

时间:2010-09-06 22:07:05

标签: c# linq foreach linq-to-objects

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 个答案:

答案 0 :(得分:6)

作为查询表达式:

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);
}

我没有放弃Ani使用List<T>.ForEach的路线 - 我个人更喜欢使用普通的foreach声明。 LINQ非常适合声明性查询; foreach是对每个元素采取强制行动的神圣。

请注意,我的查询表达式几乎等同于Ani的点表示法; C#编译器将使用稍微不同的SelectMany重载,这就是全部。在 this 特定情况下,我认为查询表达式更容易理解;在更简单的情况下,我更喜欢点符号。

答案 1 :(得分:1)

这可能不是最有效的,但是:

 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);