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 のEqualsメソッドとGetHashCodeメソッドをオーバーライドするか、 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 に答える