2014-05-01 140 views
0

我有兩個不同類型的類別的兩個列表。我想選擇第一個列表中具有屬性的所有項目(我們稱之爲名稱),這些項目沒有在另一個列表中具有同名的對象。linq選擇項目列表中項目的屬性不在另一個列表項目的屬性

例如,如果我有年齡項目的列表(JOE,4),(嫁,5),(編輯,2)

和的關係項目(JOE,父親),(編另一個列表,弟弟)

我想用一個產生的列表(結婚,5)

我不知道,如果「除」莫名其妙地被這裏來結束。

+0

我們可以接受的任何代碼努力?準備一些樣本數據會有所幫助。 –

回答

0

給定兩個不同類型的數組(我在這裏使用匿名類型,但它與正確的類有相同的處理),您需要首先提取例外的'key'。在這種情況下,'鑰匙'是Name財產。

//Setup 
var ageItems = new [] { new {Name = "Joe", Age=4}, new {Name = "Marry", Age=5}, new {Name="Ed", Age=2} }; 
var relationItems = new [] { new {Name="Joe", Rel = "Father"}, new {Name="Ed", Rel="Brother"} }; 

//Get the names 
var exceptedNames = ageItems.Select (a => a.Name).Except(relationItems.Select (r => r.Name)); 

//At this point, we have an `IEnumerable` containing 'Marry', we need to get the instances 
var exceptedItems = ageItems.Where(a => exceptedNames.Contains(a.Name)); 

當然,作爲LINQ,你可以重擊所有到一個呼叫:

var exceptedItems = ageItems.Where (a => ageItems.Select (b => b.Name).Except(relationItems.Select (r => r.Name)).Contains(a.Name)); 

您不能使用.Except過載爲你的類不同,其採用IEqualityComparer實例,IEqualityComparer能只比較兩個相同類型的項目,因此我們必須概括並提取相同的字段。

相關問題