標籤:

(1 條消息).Net 為什麼不為 Dictionary 提供 IEqualityComparer 的默認實現?

如題。本來問題標題里還有IComparer的,知乎告訴我問題超長。

剛剛自己寫了個DictionaryEqualityComparer&,感覺好麻煩~尤其IEqualityComparer還要重載GetHashCode。如果提供的話,豈不省很多事?還有,KeyValuePair&也一樣,沒提供這倆介面的默認實現。為什麼?

public class DictionaryComparer& : EqualityComparer&&>
{
public IEqualityComparer& KeyComparer { get; set; }
public IEqualityComparer& ValueComparer { get; set; }

public DictionaryComparer(IEqualityComparer& keyComparer, IEqualityComparer& valueComparer)
{
KeyComparer = keyComparer;
ValueComparer = valueComparer ?? EqualityComparer&.Default;
}

public override bool Equals(IDictionary& expected, IDictionary& actual)
{
if (KeyComparer != null)
{
actual = new Dictionary&(actual, KeyComparer);
}
foreach (TKey key in expected.Keys)
{
if (!actual.ContainsKey(key))
{
return false;
}
if (!ValueComparer.Equals(expected[key], actual[key]))
{
return false;
}
}
return true;
}

public override int GetHashCode(IDictionary& obj)
{
return obj.Sum(c =&> c.Key.GetHashCode() * c.Key.GetHashCode() * c.Value.GetHashCode());
}
}


沒看懂你在說什麼。

1、IEqualityComparer&有默認實現:

EqualityComparer(T).Default 屬性 (System.Collections.Generic)

2、Dictionary&<&>對象可以直接獲取當前的IEqualityComparer&

Dictionary(TKey, TValue).Comparer 屬性 (System.Collections.Generic)

3、如果你的問題是,Dictionary&<&>對象為什麼不默認實現IEqualityComparer&,那麼答案是做不到。因為兩個Dictionary&<&>對象所適用的用於標識Key的唯一性的IEqualityComparer&可能是不一樣的。也就是同樣兩個Dictionary&,如果他們的Comparer屬性不一樣,那麼理論上這兩個字典是不可比較的。

4、如果你只是要比較兩個Dictionary的所有KeyValuePair集合是不是相等,直接new HashSet&&>( dictionary )來比較就可以了。


猜你是想比較兩個Dictionary是不是等價?那麼應該實現 IEquatable&介面, IEqualtiyComparer&是給放在Dictionary里的key用的,除非你想把Dictionary作為另外一個Dictionary的key。


『』『


推薦閱讀:

如何評價基於 C++ 17 的框架 MCF?
如何評價 Christopher Kohlhoff 實驗性的 C++ Network 標準庫 ?
為什麼bs虛函數表的地址(int*)(&bs)與虛函數地址(int*)*(int*)(&bs) 不是同一個?
我是初學c++者,我想達到熟練使用c++的程度,我就想知道達到什麼地步才能算是熟練使用呢?

TAG:NET | C |