gpt4 book ai didi

.Net 字典和等号的覆盖

转载 作者:行者123 更新时间:2023-12-04 10:57:51 25 4
gpt4 key购买 nike

我知道当我使用自定义类作为键创建字典时,我提供键时的匹配是通过引用比较完成的。例如:

public class SomeClass
{
public object SomeValue { get; set; }
}

// ....
public static void Main()
{
var dict = new Dictionary<SomeClass, string>();

var key1 = new SomeClass { SomeValue = 30 };
dict[key1] = "30";

Console.WriteLine(dict[key1]); // prints "30"

var key2 = new SomeClass { SomeValue = 30 };
Console.WriteLine(dict[key2]); // prints null
}

如果我在 SomeClass 中覆盖 Equals(和 ==)会发生什么类(class)?我会在输出的第二行得到“30”吗?

如果我想要一个基于引用而不是成员值的字典,但我已经覆盖了 Equals,该怎么办?

谢谢!!

最佳答案

简答

是,如果您覆盖 EqualsGetHashCode方法您的自定义键比较将开始工作。

长答案
Dictionary<TKey,TValue> class 不一定会进行基于引用的比较。它改为使用 IEqualityComparer<TKey>可以提供给构造函数的实例。如果未提供,则默认值为 EqualityComparer<T>.Default .
EqualityComparer<T>.Default的过程作品复杂。但总结是

  • 寻找 IEquatable<T>在类型上,如果存在则用于相等
  • 默认使用 Equals方法默认为 Object.Equals因此引用比较

  • 所以类型可以覆盖几个级别的比较
  • 通过指定自定义 IEqualityComparer<T>
  • 实现 IEquatable<T>和覆盖 GetHashCode
  • 覆盖 EqualsGetHashCode

  • 相等运算符 ==!=TKey 不起作用输入 Dictionary<TKey,TValue> .

    关于.Net 字典和等号的覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4262027/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com