您如何确定两个 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看方法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 是不是相等(按值,而不是按引用)?的主要内容,如果未能解决你的问题,请参考以下文章