为了账号安全,请及时绑定邮箱和手机立即绑定

比较两个通用列表差异的最快方法

比较两个通用列表差异的最快方法

C#
幕布斯6054654 2019-10-06 15:04:01
比较两个大型项目(> 50.000个项目)最快(且最不占用资源)是什么,因此有两个列表如下:显示在第一个列表中但不在第二个列表中的项目出现在第二个列表中但不在第一个列表中的项目目前,我正在使用List或IReadOnlyCollection,并在linq查询中解决此问题:var list1 = list.Where(i => !list2.Contains(i)).ToList();var list2 = list2.Where(i => !list.Contains(i)).ToList();但这并没有我想要的那样好。有什么想法可以让我更快地,减少资源消耗,因为我需要处理很多列表?
查看完整描述

3 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

用途Except:


var firstNotSecond = list1.Except(list2).ToList();

var secondNotFirst = list2.Except(list1).ToList();

我怀疑有这实际上是略高于这个速度的方法,但即使这样会大大超过你的O(N * M)的方法要快。


如果要组合使用这些方法,可以使用上面的方法创建一个方法,然后再使用return语句:


return !firstNotSecond.Any() && !secondNotFirst.Any();

要注意的一点是,有是在问题的原代码和这里的解决方案之间的结果有所不同:任何重复的元素,其仅在一个列表将只与我的代码报告一次,而他们会被报告为多原始代码中出现的次数。


例如,清单[1, 2, 2, 2, 3]和[1],在“列表1中的元素,但不是列表2”导致原始代码将是[2, 2, 2, 3]。用我的代码就可以了[2, 3]。在许多情况下,这不是问题,但是值得一提。


查看完整回答
反对 回复 2019-10-06
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

更有效的方法是使用Enumerable.Except:


var inListButNotInList2 = list.Except(list2);

var inList2ButNotInList = list2.Except(list);

通过使用延迟执行来实现此方法。这意味着您可以编写例如:


var first10 = inListButNotInList2.Take(10);

由于它内部使用a Set<T>比较对象,因此它也是有效的。它的工作方式是首先从第二个序列中收集所有不同的值,然后流式传输第一个序列的结果,并检查它们以前没有被看到过。


查看完整回答
反对 回复 2019-10-06
  • 3 回答
  • 0 关注
  • 610 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信