![]() |
1
105
事实证明,微软已经在其测试框架中涵盖了这一点: CollectionAssert.AreEquivalent
使用Reflector,我修改了areequivalent()后面的代码,以创建相应的相等比较器。它比现有的答案更完整,因为它考虑了空值,实现了IEqualityComparer,并有一些效率和边缘案例检查。另外,它是 微软 :)
样品使用情况:
或者,如果您只想直接比较两个集合:
最后,您可以使用您选择的相等比较器:
|
![]() |
2
88
一个简单且相当有效的解决方案是对两个集合进行排序,然后比较它们是否相等:
这个算法是O(n*logn),而上面的解是O(n^2)。 如果集合具有某些属性,则可以实现更快的解决方案。例如,如果两个集合都是哈希集,则它们不能包含重复项。此外,检查哈希集是否包含某些元素的速度非常快。在这种情况下,类似于您的算法可能是最快的。 |
![]() |
3
31
创建字典“dict”,然后为第一个集合中的每个成员执行dict[member]++; 然后,以相同的方式循环第二个集合,但对于每个成员,请执行dict[member]--。 最后,循环字典中的所有成员:
编辑:据我所知,这与最有效的算法的顺序相同。该算法是O(n),假设字典使用O(1)查找。 |
![]() |
4
18
这是我的(受到d.jennings的严重影响)比较方法的一般实现(在c中):
|
![]() |
5
10
|
![]() |
6
5
编辑:我一提出这只适用于集合就意识到了——它不能正确地处理具有重复项的集合。例如1、1、2和2、2、1从该算法的角度来看是相等的。但是,如果您的集合是集合(或者可以用这种方式测量它们的相等性),我希望您发现下面的内容有用。 我使用的解决方案是:
Linq在封面下做字典的事情,所以这也是O(N)。(注意,如果集合大小不同,则为O(1)。 我使用丹尼尔建议的“setequal”方法、igor建议的orderby/sequenceequals方法和我的建议进行了一次健全性检查。结果如下,显示igor为O(n*logn),Mine和Daniel为O(n)。 我认为Linq Intersect代码的简单性使它成为首选的解决方案。
|
![]() |
7
5
在没有重复和顺序的情况下,可以使用以下EqualityComparer将集合作为字典键:
Here 是我使用的tohashset()实现。这个 hash code algorithm 来自有效的Java(通过乔恩SKET)。 |
![]() |
8
4
解决方案需要.NET 3.5和
|
![]() |
9
3
为什么不使用.except()。
|
![]() |
10
3
如果你使用 Shouldly ,您可以使用shouldallbe和contains。
最后,您可以编写一个扩展。
更新 上存在可选参数 应该是 方法。
|
![]() |
11
2
|
![]() |
12
2
一个重复的帖子,但是 check out my solution for comparing collections . 很简单: 这将执行相等比较,而不考虑顺序:
这将检查是否添加/删除了项目:
这将看到字典中的哪些项发生了更改:
原帖 here . |
![]() |
13
1
这是我对ohadsc答案的扩展方法变体,以防对某人有用。
|
![]() |
14
1
这是一个解决方案,它比 this one .
|
![]() |
15
0
这个问题有很多解决办法。 如果你不在乎复制品,你就不必两者都排序。首先,确保它们具有相同数量的项目。在那之后是一个收藏。然后binsearch排序集合中第二个集合中的每个项。如果找不到给定的项目,请停止并返回false。 这一点的复杂性: -排序第一个集合:n 日志(n) -从第二个搜索到第一个:n 日志(n) 所以你最终得到2*n*log(n),假设它们是匹配的,你可以查找所有东西。这类似于对两者进行排序的复杂性。如果有差异,这也可以让您提前停止。 但是,请记住,如果在进行比较之前对两者都进行了排序,并且尝试使用类似qsort的方法进行排序,那么排序将更加昂贵。对此有一些优化。 另一种选择是,对于您知道元素范围的小集合来说,使用位掩码索引是很好的选择。这将给你一个O(N)的表现。 另一种选择是使用哈希并查找它。对于小的集合,进行排序或位掩码索引通常要好得多。hashtable的缺点是位置更差,所以请记住这一点。 再说一遍,只有当你不在乎重复的时候。如果您想说明重复项,请对两者进行排序。 |
![]() |
16
0
在许多情况下,唯一合适的答案是igor ostrovsky中的一个,其他答案是基于对象散列代码的。 但是,当您为一个对象生成哈希代码时,您这样做只是基于对象的不可变字段(例如对象ID字段(对于数据库实体))。 Why is it important to override GetHashCode when Equals method is overridden? 这意味着,如果比较两个集合,即使不同项的字段不相等,比较方法的结果也可能为真。 要深入比较集合,需要使用igor方法并实现IEquality。 请阅读我和施奈德先生在他投票最多的帖子上的评论。 詹姆斯 |
![]() |
17
0
允许在
我不是复杂性度量方面的专家,但我的基本理解是这应该是O(N)。我理解O(n^2)来自于在另一个O(n)操作中执行O(n)操作,如
如我所说,我对复杂性的理解是有限的,所以如果我错了,请纠正我的看法。
|
![]() |
18
0
This simple solution
迫使
如果您不想做这样的假设,但仍然想使用这个解决方案,您可以使用下面的代码:
|
![]() |
illusionist · 覆盖==等式运算符仅在一个方向上起作用 7 年前 |
![]() |
babybob · 转换为“对象”类型的目的是什么? 8 年前 |
![]() |
Kevin Meredith · 定义自由Monad的相等实例 9 年前 |
![]() |
Mansour · Java检查字符串的相等性 9 年前 |