2016-06-10 75 views
1

的第二列表中缺少的元素,我有兩個型動物類型列表:獲取不同類型

List<class1> list1; 
List<class2> list2; 

這兩個實體有一個叫Id相同的屬性。 list1包含10個元素,list2有200

我需要得到元素的list1誰根據現場Idlist2不在名單。

我知道有一個叫做Except的Linq運算符,但它僅適用於相同類型的兩個元素,並且假定實體的所有字段都是相等的。

+2

可能的複製(http://stackoverflow.com/questions/9748138/exclude-a-collection-from-another-by-lambda) – piotrwest

+0

看一看Jon Skeets在這裏回答:http://stackoverflow.com/questions/9748138/exclude-a-collection-from-another-by-lambda – Robban

+1

本文假設這兩個列表是相同的類型,不是嗎? –

回答

3

提出將無法很好地擴展爲您列出的大小隨着對方回答。一個簡單的更改使其更具性能是將異常列表轉換爲HashSet。如果ID屬性是一個整數,它會是這個樣子:

var exceptIds = new HashSet<int>(list2.Select(y => y.Id).Distinct()); 
var unmatched = list1.Where(x => !exceptIds.Contains(x.Id)).ToList(); 
unmatched.Dump(); // LinqPad method, to see output 

如果ID的類型是別的東西,只需將它替換到第一線爲泛型類型參數。或者,您也可以使用左連接技術生成相同的不匹配輸出,就像SQL中的「查找不匹配的記錄」查詢一樣。

var unmatched = (from item in list1 
       join item2 in list2 on item.Id equals item2.Id into grp 
       from x in grp.DefaultIfEmpty() 
       where x == null 
       select item).ToList(); 
的[從另一個由拉姆達排除集合]
+0

這確實是正確的答案。 –

1

這個怎麼樣:

var exceptIds = list2.Select(y => y.Id).Distinct().ToList(); 
list1 = list1.Where(x => !exceptIds.Contains(x.Id)).ToList(); 
+0

它工作正常。這個linq操作有任何性能問題嗎? –

+0

我改正了答案,現在已經足夠優化了。 –