c# - Dictionary(TKey, TValue) GetHashCode 和 Equals - 它们是如何工作的?

标签 c#

您会认为,如果两个字典包含相同的键和值,它们将返回相同的哈希码并且是相等的,对吗?但他们没有-我做错了什么?或者我如何以这种方式比较字典?

谢谢。下面的代码相同

/在这种情况下我也想测试顺序是否相同/相等。

     SortedDictionary<int,string> sd1 = new SortedDictionary<int,string>();
        sd1.Add(1,"one");
        sd1.Add(2, "two");
        sd1.Add(5, "five");
        int sd1Hash = sd1.GetHashCode();

        SortedDictionary<int, string> sd2 = new SortedDictionary<int, string>();
        sd2.Add(1, "one");
        sd2.Add(2, "two");
        sd2.Add(5, "five");
        int sd2Hash = sd2.GetHashCode();

        //This is false
        bool areEqual = sd1.Equals(sd2);

最佳答案

如果您想测试集合是否相等,包括它们的顺序:

bool areEqual = sd1.SequenceEqual(sd2);

如果您想将集合视为无序集:

bool areEqual =
    (sd1.Count == sd2.Count) && (sd1.Intersect(sd2).Count() == sd1.Count);

(如果需要,SequenceEqualIntersect 也可以采用 IEqualityComparer 参数。)

正如其他几个答案所述,SortedDictionary 不会覆盖 EqualsGetHashCode 的默认实现。 Equals 的默认实现将使用引用相等性并返回 false,因为您正在比较两个单独的对象。

关于c# - Dictionary(TKey, TValue) GetHashCode 和 Equals - 它们是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/980295/

相关文章:

c# - 如何使树节点的值成为 IEnumerable?

c# - WPF View 中的继承/ "Componization"

c# - 安装 Reactive Extensions 后动态使用 Newtonsoft Json 时出现 RuntimeBinderException

c# - 代码契约和类型转换

c# - 如何在c#中查找URL的内容?

c# - Async/Await 和 Dispatcher 之间的区别

c# - 需要帮助将一张图片与另一张图片合并

C# 在 Base64 中解码大型/巨大的 XML/CDATA 上下文

c# - 具有 C# 背景的编写 JavaScript 的常见错误

c# - ExecuteScalar 返回与纯 SQL 不同的结果