代码之家  ›  专栏  ›  技术社区  ›  Bruno Brant

.Net字典和重写Equals

  •  7
  • Bruno Brant  · 技术社区  · 14 年前

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

    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 上课?我能在输出的第二行得到“30”吗?

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

    谢谢!!

    1 回复  |  直到 14 年前
        1
  •  11
  •   Jon Skeet    14 年前

    简短的回答

    是的,如果你重写 Equals GetHashCode 方法您的自定义密钥比较将开始工作。

    冗长的回答

    这个 Dictionary<TKey,TValue> IEqualityComparer<TKey> 可以提供给构造函数的实例。如果未提供,则默认值为 EqualityComparer<T>.Default .

    过程 EqualityComparer<T>。默认值 工作很复杂。但总结一下

    • 寻找 IEquatable<T> 在类型上,如果存在,则用于相等
    • 默认使用 等于 默认为 Object.Equals 因此进行了参考比较

    所以类型可以在几个级别上覆盖比较

    • 通过指定自定义 IEqualityComparer<T>
    • 实施 可量化<T> 和超越 方法
    • 超越 等于 方法

    相等运算符 == != 不要为 TKey 键入 字典<TKey,TValue> .