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

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


显示在第一个列表中但不在第二个列表中的项目

出现在第二个列表中但不在第一个列表中的项目

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


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

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

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


幕布斯6054654
浏览 611回答 3
3回答

九州编程

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

慕哥9229398

更有效的方法是使用Enumerable.Except:var inListButNotInList2 = list.Except(list2);var inList2ButNotInList = list2.Except(list);通过使用延迟执行来实现此方法。这意味着您可以编写例如:var first10 = inListButNotInList2.Take(10);由于它内部使用a Set<T>比较对象,因此它也是有效的。它的工作方式是首先从第二个序列中收集所有不同的值,然后流式传输第一个序列的结果,并检查它们以前没有被看到过。
打开App,查看更多内容
随时随地看视频慕课网APP