比较嵌套哈希集的相等性

3

我有一个情况,需要比较嵌套哈希集的相等性,以确定它们是否包含相同的元素。以下是一个快速示例,说明了这个问题:

    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返回true。从我的调试中,似乎HashSet.SetEquals()方法让它的子元素获取它们的哈希码并使用它们来比较相等性,这是有道理的。

我浏览了一些关于StackOverflow的类似问题,但还没有找到完全解释清楚的。我是否需要为HashSet实现自定义IEqualityComparer,或者我正在做某些明显的不正确的事情?

1个回答

5
当您创建集合的集合时,如果没有提供比较器,则将使用默认比较器来比较集合的引用。使用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 };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接