c# - 比较嵌套哈希集的相等性

标签 c# hashset

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

    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,或者是否有更明显的地方我做错了?

最佳答案

当您创建集合的集合时,您没有提供比较器,因此将使用默认的比较器,它将根据引用比较集合。 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 };

关于c# - 比较嵌套哈希集的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31658814/

相关文章:

java - 将对象数组放入 Map 和 Set 中

java - HashSet中加入WrappedString和String的区别

c# - Visual Studio 可以将项目引用编译到不同的文件夹然后是主 .exe

c# - Linq to XML - 尝试打印无穷大符号

java - 获取对 Set 中重复项的引用

java - 如何在 if 语句中使用 java empty HashSet?

Java HashSet 保留第一个和最后一个元素

c# - 关于 .Equals() 与 == 运算符以及基元与对象的比较的混淆

c# - Selenium WebDriver 偶尔抛出超时异常

c# - 你知道任何基于 C# 的 "puzzles and answers"之类的书吗?文章?资源?