【问题标题】:LINQ - Find all items in one list that aren't in another listLINQ - 查找一个列表中不在另一个列表中的所有项目
【发布时间】:2012-07-10 06:16:52
【问题描述】:

我坚持使用 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.***

【问题讨论】:

  • 您在 google 中搜索到的确切标题:google.com/…
  • @JoeTuskan 然而这个问题获得了投票!
  • 我可以在 google 上找到任何东西,SO 是一个很好的网站,因为我可以在 30 秒内输入一个问题,然后处理其他事情,并在以后获得专家论证的完美答案,而不会浪费任何时间或使用可能效率低下的第一个谷歌答案和浪费时间自己去发现,而我得到报酬来完成工作:p

标签: c# .net linq .net-3.5


【解决方案1】:

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

var result = list1.Except(list2);

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

重要提示:尽管该方法提供了指向 MSDN 文档的链接,但我将在此处指出这一点:Except 仅适用于原始类型集合,对于 POCO/对象,您需要实现 IEquatable在那个物体上。

【讨论】:

  • 但前提是IdentifierLookupData实现IEquatable&lt;IdentifierLookupData&gt;
  • 这个答案真的应该被编辑为 *Except 仅适用于原始列表,对于 POCO/对象,您需要在该对象上实现 IEquatable。
【解决方案2】:

试试这个:

var List2 = OriginalList.Where(item => !List1.Any(item2 => item2.ID == item.ID));

【讨论】:

  • 我喜欢这个,因为我可以将它用于两种不同类型的列表,比如日期。我需要根据另一个列表过滤掉原始列表。 +1
  • 我也喜欢这个,因为可以比较不同类型的列表。太好了!
【解决方案3】:

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

var deletedItems = list1.Except(joinItems);

这将返回list1 中不包含在joinItems 中的项目集

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-08
    • 2022-11-12
    • 1970-01-01
    • 2017-06-06
    • 2022-11-03
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    相关资源
    最近更新 更多