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]。在许多情况下,这不是问题,但是值得一提。
TA贡献1877条经验 获得超6个赞
更有效的方法是使用Enumerable.Except:
var inListButNotInList2 = list.Except(list2);
var inList2ButNotInList = list2.Except(list);
通过使用延迟执行来实现此方法。这意味着您可以编写例如:
var first10 = inListButNotInList2.Take(10);
由于它内部使用a Set<T>比较对象,因此它也是有效的。它的工作方式是首先从第二个序列中收集所有不同的值,然后流式传输第一个序列的结果,并检查它们以前没有被看到过。
- 3 回答
- 0 关注
- 610 浏览
添加回答
举报