0
我有兩個不同類型的類別的兩個列表。我想選擇第一個列表中具有屬性的所有項目(我們稱之爲名稱),這些項目沒有在另一個列表中具有同名的對象。linq選擇項目列表中項目的屬性不在另一個列表項目的屬性
例如,如果我有年齡項目的列表(JOE,4),(嫁,5),(編輯,2)
和的關係項目(JOE,父親),(編另一個列表,弟弟)
我想用一個產生的列表(結婚,5)
我不知道,如果「除」莫名其妙地被這裏來結束。
我有兩個不同類型的類別的兩個列表。我想選擇第一個列表中具有屬性的所有項目(我們稱之爲名稱),這些項目沒有在另一個列表中具有同名的對象。linq選擇項目列表中項目的屬性不在另一個列表項目的屬性
例如,如果我有年齡項目的列表(JOE,4),(嫁,5),(編輯,2)
和的關係項目(JOE,父親),(編另一個列表,弟弟)
我想用一個產生的列表(結婚,5)
我不知道,如果「除」莫名其妙地被這裏來結束。
給定兩個不同類型的數組(我在這裏使用匿名類型,但它與正確的類有相同的處理),您需要首先提取例外的'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
能只比較兩個相同類型的項目,因此我們必須概括並提取相同的字段。
我們可以接受的任何代碼努力?準備一些樣本數據會有所幫助。 –