您如何确定两个 HashSet 是不是相等(按值,而不是按引用)?

Posted

技术标签:

【中文标题】您如何确定两个 HashSet 是不是相等(按值,而不是按引用)?【英文标题】:How do you determine if two HashSets are equal (by value, not by reference)?您如何确定两个 HashSet 是否相等(按值,而不是按引用)? 【发布时间】:2010-10-04 09:35:50 【问题描述】:

我正在尝试确定 .NET 3.5 (C#) 中的两个 HashSet 对象是否是相等的集合,包含相同的值。这似乎是一个显然想要做的事情,但所提供的功能似乎都没有为您提供这些信息。

我能想到的方法是检查两个集合的计数是否相等并且一个集合是另一个集合的子集(不正确)。我认为可能发生的唯一方法是它们是相等的集合。示例代码:

HashSet<int> set1 = new HashSet<int>();
set1.Add(1);
set1.Add(2);
set1.Add(3);

HashSet<int> set2 = new HashSet<int>();
set2.Add(1);
set2.Add(2);
set2.Add(3);

if(set1.Count == set2.Count && set1.IsSubsetOf(set2))

    // do something

这总是有效吗?有没有更好的办法?为什么HashSet 没有public bool IsEqualSetWith() 功能?

【问题讨论】:

我希望我的 set 对象找出我拥有的列表并返回 false。相反,如果调用者使用 set 调用我的方法并且它恰好具有相同的元素,我希望我的 set 对象在内部调用 SetEquals() 而不必向下转换并使用特殊方法。换句话说,使用多态性和封装,就像在学校教的那样。让我震惊的是,C# 库怎么会错过这么久而没有人抱怨。 虽然 SetEquals() 确实可以工作,但就良好的 OO 而言,它显然不是一个理想的解决方案。理想情况下,我想使用 ICollection 或 IEnumerable 等接口。当您开发一个供其他开发人员利用的平台时,这不是完美主义的象牙塔,而是非常真实的 API 设计考虑。无论如何,如果我的 API 接受 ICollection 作为参数,我希望能够调用 .Equals() 来将该参数与某个已知值进行比较。如果调用者给了我一个列表,我在我的 API 方法中将它与一个集合进行比较,(续) 它叫做 IEqualityComparer :) SetEquals 没有任何问题。 注意加法的顺序与hashset相等性无关。 【参考方案1】:

看方法SetEquals。

my_hashset.SetEquals(other);

【讨论】:

谢谢迈克尔,我不知道我是怎么完全错过了 MSDN 上的方法列表中的... 每个人都会在某个时候发生。我简直不敢相信我在 .NET 问题上击败了 Jon Skeet 和 Marc Gravell。我猜他们确实必须在某个时候睡觉。【参考方案2】:
IEqualityComparer<HashSet<int>> comp = HashSet<int>.CreateSetComparer();
Console.WriteLine("CreateSetComparer set1 == set2 : 0", comp.Equals(set1, set2));
// or
bool areEqual = HashSet<int>.CreateSetComparer().Equals(set1, set2);

【讨论】:

当您需要创建一个字典,其中 HashSet 用作键时,这很有用。

以上是关于您如何确定两个 HashSet 是不是相等(按值,而不是按引用)?的主要内容,如果未能解决你的问题,请参考以下文章

java中如何比较两个数组确定是不是相等?

Java 复习1

如何确定两个 JavaScript 对象的相等性?

Java基础篇 如何使用HashSet

Set

PySpark如何按值排序,如果值相等,按键排序?