9

別の辞書 (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;
}
4

5 に答える 5

12

Dictionary.Equals() は、デフォルトの Equals from Object を使用して、他のすべてのデフォルト コレクションと同様に、2 つのオブジェクトが同じ参照であるかどうかをチェックします。値のセマンティクスを使用して独自のサブクラスを自由に作成できますが、これには通常、不変のものも含まれます。

于 2009-10-30T14:03:07.647 に答える
5

おそらく、クラスのEqualsメソッドは、Dictionaryから継承されたデフォルトの実装に単純に依存します。つまり、渡されたオブジェクト参照を独自の参照Objectと比較するだけです。Dictionaryここを参照してください: Object.Equals リファレンス

于 2009-10-30T14:00:24.267 に答える
2

SortedList<TKey, TValue>aとa という 2 つの辞書Dictionary<TKey, TValue>が等しいかどうか比較されると仮定すると、アイテムが同じである場合、本当に true を返す必要がありますか? それらは異なる特性と機能を持っているため、これはかなり悪いことです(SortedList<,>たとえば、インデックスを介した検索が可能です)。

また、等価性とハッシュ コードは論理的に結び付けられています。ハッシュ コードは不変である必要があります。そうしないと、すべてのハッシュ ベースのアルゴリズムが機能しません。コンテンツを使用して等しいかどうかを確認している場合、これは保証できません。したがって、デフォルトの実装 (それらが同じインスタンスであるかどうかをチェックする) はまったく問題ありません。ただし、独自のコンテンツ等価比較を自由に作成できます。

于 2009-10-30T14:13:35.190 に答える
1

他の人は Object.Equals 実装を使用していると述べていますが、次を使用してオーバーライドできます。

public class EqualsDictionary<T, T> : Dictionary<T, T>
{
    public override bool Equals(object obj)
    {
        //Place your comparison implementation here
    }
}
于 2009-10-30T14:11:56.223 に答える
0

.NET の参照は、オブジェクトの状態の不変の側面をカプセル化することに加えて、オブジェクトの ID、その状態の変更可能な側面、またはその両方をカプセル化するために使用することも、どちらもカプセル化しないこともできます。一般に、そうでないと仮定する特定の理由がない限り、.NET は、変更可能なオブジェクトへの参照が ID をカプセル化する目的で使用されると想定します。さらに、コードが参照が何を表しているかを知らずに参照を比較している場合は、不一致を報告する側で誤りを犯したほうがよいと想定しています。そのため、可変オブジェクトへの 2 つの参照は、それらが同じオブジェクトを識別している場合に限り、一般に同等と見なされEqualsます。代わりに、参照を使用して変更可能な状態をカプセル化するコードは、次の方法以外の手段を使用する必要があります。Object.Equals()それらを比較します。

于 2013-11-03T20:42:55.630 に答える