【问题标题】:What would this look like in Linq?这在 Linq 中会是什么样子?
【发布时间】:2011-04-13 17:15:13
【问题描述】:

大家好,我正在努力更清楚地了解 LINQ。我有一组 foreach 循环,用于循环遍历 ID 列表,然后将其与对象 ID 列表进行比较,然后将它们添加到保存结果或比较的第三个列表中。我想知道这段代码在 LINQ 中会是什么样子 list1 -> int ID 列表 list2 -> 对象列表


foreach (var mId in list1)
{
   foreach (var m in list2)
   {
      if (m.Obj.Id== mId)
      {
        result.Add(m);
        break;
      }
   }
}

【问题讨论】:

  • 要返回重复的 id 吗?
  • 我现在意识到它允许重复但实际上它不应该是我错过的对不起。

标签: c# linq


【解决方案1】:

基本上,这是执行连接的循环逻辑。使用查询语法(更具可读性)你可以这样做:

var result = from mId in list1
             join m in list2 on m.Obj.Id equals mId
             select m;

或者,如果你喜欢 lambda:

var result = list1.Join(list2, 
                        mId => mId, 
                        m => m.Obj.Id,
                        (mId, m) => m);

【讨论】:

  • +1 请注意,要使您的示例完全等同于 OP 的代码,您需要 ToArray()ToList()
  • 这可能与原始版本略有不同。 1)它应该表现更好,这是一个优点。 2)结果可能不同。在原始版本中,如果 mId 出现两次,m 可能会出现两次结果。应该保留在这里。在原始版本中,如果m.Obj.Id 出现两次,则它会出现在结果中一次。在这里,它会是两次。如果一个元素在每个列表中出现两次,您将在此处获得 4 个结果。在原始版本中,只有 2 个。这些差异重要吗?可能的?这是由提问者决定的。
  • 假设m 有适当的Equals\GetHashCode 重载(或者可以提供有效的IEqualityComparer),在加入之前使用list2.Distinct() 应该保留原始代码sn-p 的结果(如果有可能重复*)。
【解决方案2】:

看起来像这样:

var result = list2.Where(i => list1.Contains(i.Obj.Id));

【讨论】:

  • +1。这实际上得到了正确的行为(其他答案没有),同时极大地阐明了代码的意图。 "我想要 list2 中 ID 在 list1 中的所有项目。"
【解决方案3】:
var query = list1.Join(list2, x => x, x => x.Obj.Id, (outer, inner) => inner);

【讨论】:

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