簡體   English   中英

使用“external”GetHashCode和Equals for Dictionary

[英]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>的構造函數。 相等比較器必須實現EqualGetHashCode

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

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

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

哪里

comparer是:

比較時使用的實現

在實踐中

  • 您定義實現該接口的類型
  • 其傳遞給該構造函數, 使得類的方法被useed用於字典的鍵的平等鑒定。

似乎你想要什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM