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

如何编写Linq查询筛选两列表中ID匹配但Hash不同的行?

用LINQ筛选ID匹配但Hash不同的项(含List2独有项)

刚好我之前也遇到过类似的需求,咱们一步步来解决这个问题。

首先先明确你的数据结构:

class HashCheck { 
    public string Id {get; set;} 
    public string Hash {get; set;} 
}

List<HashCheck> list1; 
List<HashCheck> list2;

你的需求是得到一个结果列表,包含两类数据:

  1. 两个列表中ID相同但Hash不同的项(从list2取对应条目)
  2. List2中存在但List1完全没有的ID对应的项

方案一:拆分逻辑再合并(可读性更高)

这种方式把两种情况分开处理,代码逻辑更清晰,后续维护也方便:

// 第一步:找出ID匹配但Hash不同的项(从list2取)
var idMatchHashDiff = from item2 in list2
                      join item1 in list1 on item2.Id equals item1.Id
                      where item2.Hash != item1.Hash
                      select item2;

// 第二步:找出List2独有的项(List1中没有对应ID的)
var list2Only = list2.Where(item2 => !list1.Any(item1 => item1.Id == item2.Id));

// 合并两个结果
var resultList = idMatchHashDiff.Concat(list2Only).ToList();

方案二:单条Where语句搞定(更简洁)

如果喜欢更紧凑的写法,可以把两种判断条件合并到一个Where里:

var resultList = list2.Where(item2 => 
    // 要么是List1里没有这个ID,要么是ID存在但Hash不一样
    !list1.Any(item1 => item1.Id == item2.Id) ||
    list1.Any(item1 => item1.Id == item2.Id && item1.Hash != item2.Hash)
).ToList();

验证你的示例数据

用你给出的例子测试:

  • List1:{1:12345, 2:34323, 3:34083, 4:09887}
  • List2:{1:00001, 2:34323, 3:11112, 4:09887, 5:98845}

结果列表会包含:

  • 1:00001(ID匹配Hash不同)
  • 3:11112(ID匹配Hash不同)
  • 5:98845(List2独有)

完全符合你的需求,连额外的List2独有项也一起纳入了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:23:48