如何编写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;
你的需求是得到一个结果列表,包含两类数据:
- 两个列表中ID相同但Hash不同的项(从list2取对应条目)
- 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
相关产品推荐
相关产品推荐

