0

是否可以让类在它使用的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!
4

1 回答 1

1

您只需要覆盖mytest的EqualsGetHashCode方法或实现IEquatable

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

字典需要一个相等的实现来确定键是否相等。

您可以 使用接受比较器参数的构造函数来指定IEqualityComparer通用接口的实现;如果未指定实现,则使用默认的通用相等比较器 EqualityComparer.Default。

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

于 2013-03-07T11:15:30.047 回答