【问题标题】:Linq Puzzle: How do I convert this foreach to linq syntax?Linq Puzzle:如何将此 foreach 转换为 linq 语法?
【发布时间】:2010-09-06 22:07:05
【问题描述】:
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);
            }
        }

【问题讨论】:

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


    【解决方案1】:

    作为查询表达式:

    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&lt;T&gt;.ForEach 的路线——我个人更喜欢使用普通的 foreach 语句。 LINQ 非常适合声明式查询; foreach 是对每个元素执行的命令式操作的 godo。

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

    【讨论】:

    • 我同意不在查询中添加副作用,这是尝试在一行中完成所有操作。我也同意在这种情况下查询语法更简洁。老实说,我一直无法适应它。对于已经知道扩展方法语法的人如何最好地掌握查询语法有什么建议吗?
    • @Ani:这取决于你为什么不舒服。仅仅因为它看起来不像“正常”的 C#?还是因为您不确定编译器如何处理它? IMO 对 group by 和 join 来说是一个真正的福音。
    • 我不确定编译器对它做了什么。对我来说,第三行的where 子句对@987654327 的笛卡尔积的特定成员进行操作并不明显@ 和 namespacesuffixes,而我自己用 SelectMany 来做这件事没有问题。
    • 呵呵太棒了。你们真棒。我喜欢使用 linq 进行声明性查询的建议,然后分别处理命令式的东西。
    • +1 一直用List&lt;T&gt;.ForEach的都是单行码粉丝。但我更喜欢把它分成两部分,这样代码更易读,更能表达“我想做什么”。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多