1

私はこれを持っていますが、非常に短いので、何かが欠けていると確信しています:

public static bool ValueEquals<TKey, TValue>
    (this IDictionary<TKey, TValue> source, IDictionary<TKey, TValue> toCheck)
{
    if (object.ReferenceEquals(source, toCheck))
        return true;
    if (source == null || toCheck == null || source.Count != toCheck.Count)
        return false;
    return source.OrderBy(t => t.Key).SequenceEqual(toCheck.OrderBy(t => t.Key));
}

したがって、基本的には、それらが等しい参照を持っている場合は、を返しtrueます。どちらかがそうであるnullか、カウントが異なる場合は、 を返しfalseます。次に、シーケンス (キー、値の順) が同じ場合に戻ります。短すぎて十分ではないので、何かが足りないに違いありません。

4

1 に答える 1

4

IComparableはい、キーがすべて実装されており、キーと値の両方に、Equals比較したいものを比較するメソッドがある限り、コードは機能します。キーまたは値のいずれかにこれらのメソッドの適切な実装がない場合、これは機能しません。

メソッドは、オブジェクトがこれらのメソッドのいずれかの望ましい実装を持っていない場合を考慮して、渡されるカスタムIComparerまたはIEqualityComparerオブジェクトの機能も提供しません。これがあなたの特定のケースの問題であるかどうかはわかりません。

ソリューションでは、すべての値を並べ替える必要もあります。これは、set equals の他の可能な実装よりも効率がやや劣りますが、劇的に悪化するわけではないため、特に大きなコレクションがない場合、大きな問題にはなりません。

あなたと同等の機能を持つが速度が向上したメソッドは次のようになります(最初の2つのチェックを維持します):

return !source.Except(toCheck).Any();

このメソッドはソートに依存しないため、TKey実装する必要がないという利点もありますIComparable

このメソッドとメソッドの両方が機能する主な理由は、 がその定義をオーバーライドし、それ自体の参照に基づいているという事実によるものですがKeyValuePair、ラップするキーと値に基づいているためです。キーと値の両方が等しい場合、 2 つは等しく、ハッシュ コードにはキーと値の両方のハッシュ コードが組み込まれます。EqualsGetHashCodeKeyValuePairs

于 2013-06-05T16:23:29.720 に答える