2009-06-11 5 views
1

2つの辞書に同じキーと値が含まれていれば、同じハッシュコードを返して同等のものになると思いますか?しかし、彼らは - 私は間違って何をしていないのですか?またはこの方法で辞書をどのように比較すればよいですか?辞書(TKey、TValue)GetHashCodeとEquals - どのように動作しますか?

ありがとうございました。コードsameple以下

/この場合私はまた、同じ/等しいの順序をテストしたいと思います。

 SortedDictionary<int,string> sd1 = new SortedDictionary<int,string>(); 
     sd1.Add(1,"one"); 
     sd1.Add(2, "two"); 
     sd1.Add(5, "five"); 
     int sd1Hash = sd1.GetHashCode(); 

     SortedDictionary<int, string> sd2 = new SortedDictionary<int, string>(); 
     sd2.Add(1, "one"); 
     sd2.Add(2, "two"); 
     sd2.Add(5, "five"); 
     int sd2Hash = sd2.GetHashCode(); 

     //This is false 
     bool areEqual = sd1.Equals(sd2); 

答えて

4

あなたは、コレクションがその順序を含め、同一であることをテストする場合:

bool areEqual = 
    (sd1.Count == sd2.Count) && (sd1.Intersect(sd2).Count() == sd1.Count); 

SequenceEqual:あなたは順不同のセットとしてコレクションを扱うたい場合

bool areEqual = sd1.SequenceEqual(sd2); 

また、Intersectは、必要に応じてIEqualityComparerパラメータを取ることができます)。

その他の回答があると、SortedDictionaryは、デフォルトの実装であるEqualsまたはGetHashCodeを上書きしません。 Equalsのデフォルトの実装では、2つの別々のオブジェクトを比較しているため参照参照が使用され、falseが返されます。

+1

それは、このメソッドは、.NET 2.0では使用できないことを見つけるために私にはかなり時間がかかりました:上

あなたはより多くの情報を見つけることができます。 .NET 2.0の代替手段をご存知ですか? – Aamir

+1

辞書の内容を見て、代わりにハッシュコードと等価性を調べる独自のIEqualityComparer >を実装する必要があります。 – thecoop

+1

@Aamir私が知っている限り、.NET2、両方のコレクションを同時に繰り返し、各アイテムを順番に比較する独自のメソッドを書くのは難しくありません(SequenceEqualメソッドとまったく同じです)。 – LukeH

0

次の2つの辞書が同じキーと値が含まれている場合は、同じハッシュコードを返し、同じ右だろうと思うだろうか?

いいえ、これは、EqualsメソッドとGetHashcodeメソッドが実装されている方法ではありません。これらはオーバーライドされていないので、参照を比較するデフォルトのSystem.Object実装です。

0

あなたがこの問題については、MSDNをチェックアウトすることができます:

に等しいのデフォルトの実装では、値型のための参照型の基準平等、およびビット単位の平等をサポートしています。参照同値は、比較されるオブジェクト参照が同じオブジェクトを参照することを意味します。ビット単位の等価性は、比較されるオブジェクトが同じバイナリ表現を持つことを意味します。

したがって、SortedDictionaryには参照が含まれているため、比較されます。それらは明らかに異なっています。 http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

関連する問題