2013-03-07 39 views
0

是否有可能讓Dictionary<>類使用IEqualityComparer在它用作鍵的類中指定,而不是在每次構建它時將其指定爲參數?默認使用自定義類IEquality,而不是將其指定爲參數?

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

你只需要重寫的Equals的GetHashCode mytest的方法或實施IEquatable

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

字典需要等式實現來確定 鍵是否相等。

您可以通過使用 接受一個比較器參數的構造函數指定 的IEqualityComparer通用接口的實現;如果您未指定實現,則使用 默認通用相等比較器EqualityComparer.Default爲 。

如果類型TKey實現System.IEquatable通用接口 ,則默認的相等比較器使用該實現。

+0

謝謝,我完全忘記了在執行'GetHashCode'之後重寫'Equals()'方法 – maxp 2013-03-07 11:18:00

相關問題