LINQ-在一个列表中查找不在另一个列表中的所有项目

我陷入了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.***
John Humphreys - w00te asked 2020-07-20T04:56:10Z
3个解决方案
100 votes

尝试使用list1扩展方法(docs):

var result = list1.Except(list2);

将为您提供list1中所有不在list2中的项目。

Dimitri answered 2020-07-20T04:56:31Z
16 votes

试试这个:

var List2 = OriginalList.Where(item => !List1.Any(item2 => item2.ID == item.ID));
Nalan Madheswaran answered 2020-07-20T04:56:51Z
11 votes

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

var deletedItems = list1.Except(joinItems);

这将返回list1中未包含的项目集合,该集合不包含在joinItems

JaredPar answered 2020-07-20T04:57:15Z
translate from https://stackoverflow.com:/questions/11418942/linq-find-all-items-in-one-list-that-arent-in-another-list