Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Dictionary(TKey,TValue)GetHashCode和Equals-它们是如何工作的?_C# - Fatal编程技术网

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

C# Dictionary(TKey,TValue)GetHashCode和Equals-它们是如何工作的?,c#,C#,您可能会认为,如果两个字典包含相同的键和值,它们将返回相同的哈希代码,并且是相等的,对吗?但他们没有——我做错了什么?或者我如何用这种方式比较字典 谢谢。代码如下所示 /在这种情况下,我还想测试顺序是否相同/相等 SortedDictionary<int,string> sd1 = new SortedDictionary<int,string>(); sd1.Add(1,"one"); sd1.Add(2, "two");

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

谢谢。代码如下所示

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

     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);
SortedDictionary sd1=新的SortedDictionary();
sd1.添加(1,“一”);
sd1.添加(2,“两”);
sd1.添加(5,“五”);
int sd1Hash=sd1.GetHashCode();
SortedDictionary sd2=新的SortedDictionary();
sd2.添加(1,“一”);
sd2.添加(2,“两”);
sd2.添加(5,“五”);
int sd2Hash=sd2.GetHashCode();
//这是假的
bool areEqual=sd1。等于(sd2);

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

bool areEqual = sd1.SequenceEqual(sd2);
如果要将集合视为无序集合,请执行以下操作:

bool areEqual =
    (sd1.Count == sd2.Count) && (sd1.Intersect(sd2).Count() == sd1.Count);
SequenceEqual
Intersect
如果需要,也可以采用
IEqualityComparer
参数。)


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

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

bool areEqual = sd1.SequenceEqual(sd2);
如果要将集合视为无序集合,请执行以下操作:

bool areEqual =
    (sd1.Count == sd2.Count) && (sd1.Intersect(sd2).Count() == sd1.Count);
SequenceEqual
Intersect
如果需要,也可以采用
IEqualityComparer
参数。)

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

您可能会认为,如果两个字典包含相同的键和值,它们将返回相同的哈希代码,并且是相等的,对吗

不,Equals和GetHashcode方法不是这样实现的。它们不会被重写,因此是默认的System.Object实现,它只是比较引用

您可能会认为,如果两个字典包含相同的键和值,它们将返回相同的哈希代码,并且是相等的,对吗


不,Equals和GetHashcode方法不是这样实现的。它们不会被覆盖,因此是默认的System.Object实现,它只是比较引用。

您可以查看MSDN以了解此问题:

Equals的默认实现支持引用类型的引用相等,以及值类型的位相等。引用相等是指被比较的对象引用引用同一对象。按位相等意味着被比较的对象具有相同的二进制表示

因此,由于SortedDictionary包含引用,因此将对它们进行比较。而这些显然是不同的


您可以在以下网站上找到更多信息:

您可以查看MSDN以了解此问题:

Equals的默认实现支持引用类型的引用相等,以及值类型的位相等。引用相等是指被比较的对象引用引用同一对象。按位相等意味着被比较的对象具有相同的二进制表示

因此,由于SortedDictionary包含引用,因此将对它们进行比较。而这些显然是不同的


您可以在以下网站上找到更多信息:

我花了很长时间才发现此方法在.NET 2.0中不可用。您知道.NET 2.0的替代方案吗?您必须实现自己的IEqualityComparer,它查看字典的内容,以确定哈希代码和相等性instead@Aamir,据我所知,.NET2没有内置的替代品,虽然编写自己的方法来同时迭代两个集合并依次比较每个项并不困难(这正是SequenceEqual方法所做的),但我花了很长时间才发现该方法在.NET 2.0中不可用。您知道.NET 2.0的替代方案吗?您必须实现自己的IEqualityComparer,它查看字典的内容,以确定哈希代码和相等性instead@Aamir,据我所知,.NET2没有内置的替代品,尽管编写自己的方法并不困难,它可以同时迭代两个集合并依次比较每个项(这正是SequenceEqual方法所做的)。