2011-04-13 50 views
0

嘿,大家我想要更清楚地理解LINQ。我有一组foreach循环,我用它循环一个ID列表,然后将其与对象ID列表进行比较,然后将它们添加到保存结果或比较的第三个列表中。我想知道这段代码是什么样子的LINQ 列表1 - > INT的名单ID 列表2 - >对象这在Linq中会是什么样子?


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

你喜欢返回重复的ID? – 2011-04-13 17:20:51

+1

我现在意识到它允许重复,但实际上它不应该是我错过的遗憾。 – MrB 2011-04-13 23:55:26

回答

8

基本上是列表,即执行加入循环逻辑。使用查询语法(这是更可读的),你可以这样做:

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

或者,如果拉姆达的是你的事:

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

+1,注意你的例子要完全等同于OP的代码,你需要一个'ToArray()'或'ToList()'。 – Blindy 2011-04-13 17:20:43

+1

这可能会与原来的行为有微妙的不同。 1)它应该表现更好,这是一个加分。 2)结果可能不同。在原文中,如果'mId'出现两次,'m'可能会结果两次。这应该保留在这里。在原文中,如果'm.Obj.Id'出现两次,它将在结果中出现一次。在这里,它会是两次。如果一个元素在每个列表中有两次,你会在这里得到4个结果。原文只是2.这些差异是否重要?可能?这是提问者确定的问题。 – 2011-04-13 17:37:21

+0

假设'm'具有正确的'Equals \ GetHashCode'重载(或可提供有效的'IEqualityComparer'),在连接之前利用'list2.Distinct()'应该保留原始代码片段的结果(如果重复是可能性*)。 – 2011-04-13 17:52:40

1
var query = list1.Join(list2, x => x, x => x.Obj.Id, (outer, inner) => inner); 
2

这将是这个样子:

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

+1。这实际上得到了正确的行为(其他答案没有),同时极大地阐明了代码的意图。 “我想要'list1'中的'list2'中的所有项目。” – StriplingWarrior 2011-04-13 19:57:56