默认情况下使用自定义类IEquality而不是将其指定为参数?

时间:2013-03-07 11:09:57

标签: c# dictionary

是否可以让Dictionary<>类使用它所使用的类中指定的IEqualityComparer作为其键,而不是每次构造它时都将其指定为参数?

    public class mytest : IEqualityComparer<mytest>
    {
        public string name = "foo";
        bool IEqualityComparer<mytest>.Equals(mytest x, mytest y) { return x.name == y.name; }
        int IEqualityComparer<mytest>.GetHashCode(mytest obj) { return obj.name.GetHashCode(); }
        public override int GetHashCode() { return name.GetHashCode(); }
    }

...

    var a = new Dictionary<mytest, int>();
    a.Add(new mytest(), 1);
    a.Add(new mytest(), 2);//does not throw error...bad!

    var b = new Dictionary<mytest, int>(new mytest());
    b.Add(new mytest(), 1);
    b.Add(new mytest(), 2);//will throw error...good!

1 个答案:

答案 0 :(得分:1)

您只需覆盖 mytest 等于 GetHashCode 方法,或实施 IEquatable

http://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.80).aspx

  

Dictionary需要一个相等的实现来确定是否   钥匙是平等的。

     

您可以指定的实现   通过使用构造函数 IEqualityComparer 泛型接口   接受比较器参数;如果您没有指定实现,   默认的通用相等比较器EqualityComparer.Default是   用过的。

     

如果类型TKey实现了System.IEquatable泛型接口,   默认的相等比较器使用该实现。