58

我坚持使用 LINQ 查询(或任何其他有效的方法来完成同样的事情)。有人可以告诉我如何选择一个列表中不存在于另一个列表中的所有项目吗?

基本上,我有一个通过匹配其他两个列表之间的项目形成的列表。我需要在第一个列表中找到未找到匹配项的所有项目。有人可以在下面的第二个 LINQ 查询中填写可以实现此目标的查询吗?如果我使用 TSQL,我会这样做SELECT * NOT IN (),但我认为 LINQ 不允许这样做。

//Create some sample lists.
List<IdentifierLookupData> list1 = new List<IdentifierLookupData> { /*Init */ };
List<IdentifierLookupData> list2 = new List<IdentifierLookupData> { /*Init */ };

//Find all items in list1 and list2 that match and store them in joinItems.
var joinItems = (from d1 in list1
    join d2 in list2 on d1 equals d2
    select d1).ToList<IdentiferLookupData>();

//Find all items in list1 not in joinItems.
var deletedItems = (from d1 in list1
     ***select all items not found in joinItems list.***
4

3 回答 3

123

尝试使用.Except扩展方法(文档)

var result = list1.Except(list2);

会给你所有list1不在的项目list2

重要提示:即使为该方法提供了指向 MSDN 文档的链接,我仍将在此处指出:Except仅适用于原始类型集合的开箱即用,对于 POCO/对象,您需要在该对象上实现 IEquatable。

于 2012-07-10T17:47:57.993 回答
36

试试这个:

var List2 = OriginalList.Where(item => !List1.Any(item2 => item2.ID == item.ID));
于 2017-05-15T02:15:39.347 回答
11

最简单的方法是使用Except方法。

var deletedItems = list1.Except(joinItems);

这将返回list1不包含在joinItems

于 2012-07-10T17:46:29.703 回答