【问题标题】:How to convert the foreach loop to linq如何将foreach循环转换为linq
【发布时间】:2014-03-16 17:51:48
【问题描述】:

代码:

           foreach (var item in testItems.Distinct())
            {
                if (!testMap.ContainsKey(item.GetId()))
                {
                    testMap.Add(item.GetId(), item);
                }
            }

如何将上述代码的 foreach 循环转换为 linq?谢谢。

【问题讨论】:

  • 为什么要将其转换为 LINQ?这不是查询……还有:testMap 是什么?
  • testMap 是字典吗?您是否考虑过使用套装?
  • @astef,是的,testMap 是字典。

标签: c# linq c#-4.0 if-statement foreach


【解决方案1】:

对于 1 行版本,您可以试试这个:

testItems.Distinct().Where(i => !testMap.ContainsKey(i.GetId()).ForEach(f => testMap.Add(f.GetId, f));

这将在一行中完成整个操作,尽管我不喜欢一次性完成所有操作,因为它可能更难调试。

【讨论】:

    【解决方案2】:

    有时“将 {x} 转换为 LINQ”的正确方法是:不要。它不是适合所有工作的工具。您当前的带有foreach 和字典突变的代码就可以了。保留它。

    如果重复 ID(Distinct() 之后)不是问题,您或许可以这样做:

    var map = testItems.Distinct().ToDictionary(x => x.GetId());
    

    但仅此而已。

    【讨论】:

      【解决方案3】:
      testItems.ToList().ForEach(item=>
      {
       if (!testMap.ContainsKey(item.GetId()))
       {
         testMap.Add(item.GetId(), item);
       }
      });
      

      【讨论】:

      • 这是否真的是 LINQ 的有用用法值得怀疑 - 或者它是否真的是 LINQ...最终,它基本上与中的代码相同最初的问题,除了没有不同的,有一个额外的ToList(),还有很多额外的委托间接。
      • @Marc ,我同意,我以前从未遇到过这样微不足道的 linq 用法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多