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

Joh*_*0te 44 .net c# linq .net-3.5

我坚持使用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.***
Run Code Online (Sandbox Code Playgroud)

Dim*_*tri 100

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

var result = list1.Except(list2);
Run Code Online (Sandbox Code Playgroud)

会给你所有list1不在的物品list2.

  • 但只有`IdentifierLookupData`实现`IEquatable <IdentifierLookupData>` (6认同)

Nal*_*ran 17

试试这个:

var List2 = OriginalList.Where(item => !List1.Any(item2 => item2.ID == item.ID));
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个,因为我可以将它用于两种不同类型的列表,比如日期。我需要根据另一个列表过滤掉原始列表。+1 (2认同)

Jar*_*Par 11

最简单的方法是使用该Except方法.

var deletedItems = list1.Except(joinItems);
Run Code Online (Sandbox Code Playgroud)

这将返回list1未包含的项目集joinItems