一尘不染

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

c#

比较两个大型项目(> 50.000个项目)最快(且最不占用资源)是什么,因此有两个列表如下:

  1. 显示在第一个列表中但不在第二个列表中的项目
  2. 出现在第二个列表中但不在第一个列表中的项目

目前,我正在使用List或IReadOnlyCollection,并在linq查询中解决此问题:

var list1 = list.Where(i => !list2.Contains(i)).ToList();
var list2 = list2.Where(i => !list.Contains(i)).ToList();

但这并没有我想要的那样好。有什么想法可以让我更快地,减少资源消耗,因为我需要处理很多列表?


阅读 392

收藏
2020-05-19

共1个答案

一尘不染

用途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]。在许多情况下,这不是问题,但是值得一提。

2020-05-19