2016-06-10 27 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

我改正了答案,现在已经足够优化了。 –