2010-09-26 97 views
0

舊的linq只是有點生鏽。 如果我有2個集合EG NewCustomerList和OldCustomerList,看看是否已經存在一個姓氏,我將如何在linq中執行它。我確信有很多方法。 SelectMany響了一聲,但忘了該怎麼做!如何檢查項目是否存在於2個observableCollection中linq

在forEach我會做這樣的事情。 linq中的等價物是什麼?

 foreach (var oldCustomer in OldCustomerList) 
    { 
     foreach (var newCustomer in NewCustomerList.Where(x => x.Surname == oldCustomer.Surname)) 
     { 
      break; 
     } 
    } 

有什麼建議嗎?非常感謝

回答

4

因此,您試圖查看舊客戶姓氏的任何是否在新客戶列表中?

一個簡單的選擇:做一個連接,看看它是否是空的:(我用一個空的投影,因爲我們真的不關心連接結果)

if (OldCustomerList.Join(NewCustomerList, x => x.Surname, x => x.Surname, 
         (x, y) => null).Any()) 
{ 
    ... 
} 

另一個選項:

var oldSurnames = new HashSet<string>(OldCustomrList.Select(x => x.Surname)); 
if (NewSurnameList.Any(x => oldSurnames.Contains(x.Surname)) 
{ 
    ... 
} 

我懷疑你可能會發現你真的想無論在哪個姓氏是常見的,但...如果你可以給我們更多的情況下,我們也許能夠幫助你更加的結果。

+0

謝謝你的回覆。你的例子真的幫助我明白了。上面只是一個不合理的例子,我把它們放在一起來理解你如何處理2個藏品,當你想要找到一個具有特定屬性EG Surname的物品是否存在另一個集合。我是否與SelectMany脫離關係?感謝您的幫助 – user451259 2010-09-26 07:35:48

+0

@ user451259:SelectMany應該是您的嵌套的foreach代碼的一個非常直接的翻譯 - 但效率很低。如果你明白我的意思,這是O(n * m)的方法,而不是我的代碼的O(n + m)方法。 – 2010-09-26 07:49:45

2

你可以這樣做:

NewCustomerList.Where(n => OldCustomerList.Any(o => o.Surname == n.Surname)) 
1

這裏的另一種方法,其中也有O(n + m)複雜性+快捷通語義:

OldCustomerList.Select(cust => cust.Surname) 
       .Intersect(NewCustomerList.Select(cust => cust.Surname)) 
       .Any(); 

IMO,它比一個明確的Enumerable.Join更具可讀性: 「測試老客戶名單中的姓氏投影是否與新客戶名單中的姓氏投影具有相同的內容」,這與問題陳述非常接近。

+0

這當然是一個很好的選擇。我希望有一個「IntersectBy」標準的LINQ操作符,所以我們可以做'OldCustomerList.IntersectBy(NewCustomerList,x => x.Surname)'... – 2010-09-26 08:29:50

相關問題