比较嵌套哈希集的相等性
Comparing equality of nested hashsets
我有一种情况需要比较嵌套哈希集的相等性以确定它们是否包含相同的元素。这是一个说明问题的简单示例:
public void HashsetComparison()
{
var set1 = new HashSet<string> { "A", "B", "C" };
var set2 = new HashSet<string> { "B", "C", "A" };
var set3 = new HashSet<string> { "D", "E" };
var set4 = new HashSet<string> { "D", "E" };
//both currently return true
var test1 = set1.SetEquals(set2);
var test2 = set3.SetEquals(set4);
var set5 = new HashSet<HashSet<string>> { set1, set3 };
var set6 = new HashSet<HashSet<string>> { set2, set4 };
//currently returns false
var test3 = set5.SetEquals(set6);
}
我需要弄清楚要更改什么才能使 test3 变为 return true。从我所做的调试来看,HashSet.SetEquals() 方法似乎要求其子级获取其哈希码并使用它们来比较是否相等,这是有道理的。
我已经在 Whosebug 上浏览了一些类似的问题,但还没有找到一个可以完全向我解释的问题。我需要为 HashSet 实现自定义 IEqualityComparer 还是有更明显的地方我做错了?
当您创建集合的集合时,您没有提供比较器,因此将使用默认的比较器,它会根据它们的引用来比较集合。 SetEquals
的使用将使用集合的比较器,而不是允许将比较器传递给那些方法。
您需要将比较器传递给这两个集合,根据它们的值而不是它们的引用来比较它们。幸运的是HashSet<T>
已经提供了创建这样一个比较器的方法:
var set5 = new HashSet<HashSet<string>>(HashSet<string>.CreateSetComparer())
{ set1, set3 };
var set6 = new HashSet<HashSet<string>>(HashSet<string>.CreateSetComparer())
{ set2, set4 };
我有一种情况需要比较嵌套哈希集的相等性以确定它们是否包含相同的元素。这是一个说明问题的简单示例:
public void HashsetComparison()
{
var set1 = new HashSet<string> { "A", "B", "C" };
var set2 = new HashSet<string> { "B", "C", "A" };
var set3 = new HashSet<string> { "D", "E" };
var set4 = new HashSet<string> { "D", "E" };
//both currently return true
var test1 = set1.SetEquals(set2);
var test2 = set3.SetEquals(set4);
var set5 = new HashSet<HashSet<string>> { set1, set3 };
var set6 = new HashSet<HashSet<string>> { set2, set4 };
//currently returns false
var test3 = set5.SetEquals(set6);
}
我需要弄清楚要更改什么才能使 test3 变为 return true。从我所做的调试来看,HashSet.SetEquals() 方法似乎要求其子级获取其哈希码并使用它们来比较是否相等,这是有道理的。
我已经在 Whosebug 上浏览了一些类似的问题,但还没有找到一个可以完全向我解释的问题。我需要为 HashSet 实现自定义 IEqualityComparer 还是有更明显的地方我做错了?
当您创建集合的集合时,您没有提供比较器,因此将使用默认的比较器,它会根据它们的引用来比较集合。 SetEquals
的使用将使用集合的比较器,而不是允许将比较器传递给那些方法。
您需要将比较器传递给这两个集合,根据它们的值而不是它们的引用来比较它们。幸运的是HashSet<T>
已经提供了创建这样一个比较器的方法:
var set5 = new HashSet<HashSet<string>>(HashSet<string>.CreateSetComparer())
{ set1, set3 };
var set6 = new HashSet<HashSet<string>>(HashSet<string>.CreateSetComparer())
{ set2, set4 };