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

如何高效找出两个大型POCO列表中第一个列表的不匹配项?

高效查找List1中与List2无匹配的条目

你的当前代码效率极低,核心问题是每次判断!list2.Select(l2=>l2.OrderNumber).Contains(l1.OrderNumber)时,都会重复遍历整个150万条的List2生成OrderNumber序列,再执行线性查找的Contains操作。2万条List1数据每条都要扫一遍150万的列表,总操作次数达到300亿级,耗时超20分钟完全正常。

优化方案:用HashSet实现O(1)查询

HashSet的Contains方法是哈希查找,时间复杂度为O(1),只需先把List2的OrderNumber一次性存入HashSet,再遍历List1做检查即可,整体时间复杂度为O(m+n)(m是List2的长度,n是List1的长度),速度会提升几个数量级。

优化后的代码:

// 提前将List2的所有OrderNumber存入HashSet(仅遍历List2一次)
var list2OrderNumbers = new HashSet<string>(list2.Select(l2 => l2.OrderNumber));
// 注意:如果OrderNumber是int/long等数值类型,将HashSet的泛型改为对应类型即可

// 遍历List1筛选无匹配的条目
notmatched.AddRange(List1.Where(l1 => !list2OrderNumbers.Contains(l1.OrderNumber))
                          .Select(l1 => new SomeObj 
                          {
                              OrderNumber = l1.OrderNumber
                          }));

额外说明

  • 如果List2中存在重复的OrderNumber,HashSet会自动去重,这不会影响结果(只要存在至少一个匹配项,就不属于未匹配条目),反而能减少HashSet的内存占用和查询开销。
  • 若OrderNumber是值类型,性能会比引用类型更优,因为哈希计算更快。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:35:17