Dictionary.Equals()には実装がありますか?
-
22-07-2019 - |
質問
別のディクショナリと比較しているディクショナリがあります(IDictionaryと入力された変数)。 d1.Equals(d2)を実行すると、falseが生成されます。以下に独自のコードを記述すると、trueになります。両方ともSystem.Collections.Generic.Dictionary
です。私は何かを見逃していますか、またはキー/値を比較するDictionary
実装がEquals
にありませんか?
private static bool DictEquals<K, V>(IDictionary<K, V> d1, IDictionary<K, V> d2)
{
if (d1.Count != d2.Count)
return false;
foreach (KeyValuePair<K, V> pair in d1)
{
if (!d2.ContainsKey(pair.Key))
return false;
if (!Equals(d2[pair.Key], pair.Value))
return false;
}
return true;
}
解決
Dictionary.Equals()は、ObjectのデフォルトのEqualsを使用して、他のすべてのデフォルトコレクションと同様に、2つのオブジェクトが同じ参照であるかどうかを確認します。値セマンティクスを使用して独自のサブクラスを自由に作成できますが、通常は不変であることも含まれます。
他のヒント
おそらくEquals
クラスのDictionary
メソッドは、単にObject
から継承したデフォルトの実装に頼るだけです。つまり、渡された<=>オブジェクト参照を独自の参照と単に比較します。こちらをご覧ください: Object.Equalsリファレンス
2つの辞書(1つはSortedList<TKey, TValue>
で、もう1つはDictionary<TKey, TValue>
)が等しいかどうかを比較すると仮定します。アイテムが同じ場合、本当にtrueを返す必要がありますか?それらは異なる特性と機能を持っているため、それはかなり悪いでしょう(たとえば、SortedList<,>
はインデックスを介した検索を許可します)。
また、等式とハッシュコードは論理的に結合されています。ハッシュコードは不変である必要があります。そうでない場合、すべてのハッシュベースのアルゴリズムは機能しません。コンテンツを使用して同等性をチェックしている場合、これを保証することはできません。したがって、デフォルトの実装(同じインスタンスであるかどうかを確認する)は非常に正気です。ただし、独自のコンテンツ平等比較を自由に作成できます。
Object.Equals実装を使用していると他の人が述べていますが、次を使用してオーバーライドできます:
public class EqualsDictionary<T, T> : Dictionary<T, T>
{
public override bool Equals(object obj)
{
//Place your comparison implementation here
}
}
.NETの参照を使用して、オブジェクトの状態の不変の側面をカプセル化することに加えて、オブジェクトのアイデンティティ、その状態の可変の側面、両方、または両方をカプセル化できます。一般に、そうでないと仮定する特定の理由がない場合、.NETは、可変オブジェクトへの参照がIDをカプセル化する目的で使用されると想定します。さらに、コードが参照が何を表しているかを知らずに参照を比較している場合は、不均等なことを報告する側でエラーを起こした方が良いと想定しています。そのため、可変オブジェクトへの2つの参照は、同じオブジェクトを識別する場合にのみ一般的に同等と見なされるため、可変タイプはEquals
をオーバーライドして他の何かを示すことは推奨されません。代わりに、参照を使用して可変状態をカプセル化するコードは、Object.Equals()
以外の手段を使用してそれらを比較する必要があります。