2013-01-18 54 views
4

我想在一個不覆蓋等於或GetHashCode字典中使用類作爲鍵。這是我不想修改的來自外部庫的一個類。使用「外部」GetHashCode和等於字典

所以我想知道如果我可以使用自定義「GetHashCode」/「Equals」實現只爲一個字典?我想知道是否可以使用C++ std :: maps類似的東西

template < class Key,      // map::key_type 
      class T,      // map::mapped_type 
      class Compare = less<T>,  // map::key_compare 
      class Alloc = allocator<T> > // map::allocator_type 
      > class map; 

其中比較可用於定義自定義比較。

我不想從類中派生,因爲對象是使用現有類在外部創建的。

我可以創建一個包含原始類的類,但它改變了對Dictionary的訪問。

感謝您的想法!

+0

當你創建一個'Dictionary'您可以在'的IEqualityComparer <>'爲你的鑰匙傳遞:http://msdn.microsoft.com/en-us/library/ms132072.aspx –

+0

你可以寫一個用於實現所需行爲的鍵的簡單包裝類,並將包裝的鍵傳遞給字典。 –

+0

爲什麼要做任何事情?任何班級都適合作爲一個關鍵。 –

回答

5

當然 - 您可以實施IEqualityComparer<T>並將其傳遞到the Dictionary<,> constructor。這正是該構造:)

例如目的:

public FooByNameEqualityComparer : IEqualityComparer<Foo> 
{ 
    public int GetHashCode(Foo foo) 
    { 
     return foo.Name.GetHashCode(); 
    } 

    public bool Equals(Foo x, Foo y) 
    { 
     return x.Name == y.Name; 
    } 
} 

... 

Dictionary<Foo, int> map = new Dictionary<Foo, int>(new FooByNameComparer()); 
+0

在所有這些年中,我都沒有注意到IEqualityComparer中的GetHashCode(object)方法! (我一定以爲這是正常的Object.GetHashCode()方法!) –

+0

很簡單...謝謝! – Philipp

1

您可以使用Dictionary Constructor (Int32, IEqualityComparer)

public Dictionary(
    int capacity, 
    IEqualityComparer<TKey> comparer 
) 

其中

comparer是:

impleme比較

當在實踐中

  • 定義實現該接口
  • 其傳遞給該構造函數類型,所以類的方法useed爲ntation使用字典的關鍵字的平等標識。

看起來你想要什麼。

2

您可以將自定義IEqualityComparer<TKey>傳遞給Dictionary<TKey,TValue>的構造函數。相等比較器必須實現EqualGetHashCode

var dict = new Dictionary<MyKey,MyValue>(new MyKeyEqualityComparer());