2011-04-13 35 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