You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用LINQ从List1中筛选出List2中无匹配Id的元素?

问题分析与解决方案

问题说明

有两个带Name、Age、Id属性的列表List1和List2,需要基于Id筛选出List1中所有在List2里找不到匹配Id的元素。

数据示例

  • List1数据:
    {John, 10, 1},
    {Joe, 20, 2},
    {Mary, 30, 3}
    
  • List2数据:
    {John, 10, 1}
    {Joe, 20, 2}
    {Mary, 30, 5}
    

预期结果:返回List1中的{Mary, 30, 3}

原代码错误原因

你写的这段代码:

var invalidElements = list1
                .Select(o => list2.Any(p => p.Id != o.Id))
                .ToList();

存在两个核心问题:

  1. Select操作会把每个list1元素转换成布尔值(true/false),最终得到的是布尔列表,而非你需要的原对象列表。
  2. 逻辑判断错误:list2.Any(p => p.Id != o.Id)的意思是「只要List2里有任意一个元素Id不等于当前元素Id,就返回true」,但你实际需要的是「List2里没有任何一个元素Id等于当前元素Id」。

正确实现代码

方法一:直接用Where+Any筛选

var invalidElements = list1
    .Where(o => !list2.Any(p => p.Id == o.Id))
    .ToList();

方法二:先提取Id集合(大列表场景更高效)

先把List2的所有Id存入HashSet,后续查询时性能更好:

var list2Ids = new HashSet<int>(list2.Select(p => p.Id));
var invalidElements = list1
    .Where(o => !list2Ids.Contains(o.Id))
    .ToList();

两种方法都能得到你期望的结果:List1中的{Mary, 30, 3}。

内容的提问来源于stack exchange,提问作者user14925447

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 06:18:23