![](/img/trans.png)
[英]Will Dictionary<TKey, TValue> use TKey.Equals and TKey.GetHashCode?
[英]Use “external” GetHashCode and Equals for Dictionary
我想在Dictionary中使用一個類作為鍵,它不會覆蓋Equals和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;
其中Compare可用於定義自定義比較。
我不想從類派生,因為對象是使用現有類在外部創建的。
我可以創建一個包含原始類的類,但這會更改對Dictionary的訪問。
謝謝你的想法!
當然 - 您可以實現IEqualityComparer<T>
並將其傳遞到Dictionary<,>
構造函數中 。 這正是構造函數的目的:)
例如:
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());
您可以將自定義IEqualityComparer<TKey>
傳遞給Dictionary<TKey,TValue>
的構造函數。 相等比較器必須實現Equal
和GetHashCode
。
var dict = new Dictionary<MyKey,MyValue>(new MyKeyEqualityComparer());
您可以使用Dictionary Constructor(Int32,IEqualityComparer) ,
public Dictionary(
int capacity,
IEqualityComparer<TKey> comparer
)
哪里
comparer
是:
比較鍵時使用的實現
在實踐中
似乎你想要什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.