msdn c#のドキュメントとスタックオーバーフローを検索することで、キーの一意性のチェックと検索Dictionary<T,T>
に使用することになっている明確な印象を得ることができます。GetHashCode()
Dictionaryジェネリッククラスは、キーのセットから値のセットへのマッピングを提供します。ディクショナリへの各追加は、値とそれに関連付けられたキーで構成されます。Dictionaryクラスはハッシュテーブルとして実装されているため、キーを使用して値を取得するのは非常に高速で、O(1)に近いです。...取得の速度は、TKeyに指定されたタイプのハッシュアルゴリズムの品質によって異なります。
私は(Unity3Dで)monoを使用しており、作業で奇妙な結果が得られた後、次の実験を行いました。
public class DictionaryTest
{
public static void TestKeyUniqueness()
{
//Test a dictionary of type1
Dictionary<KeyType1, string> dictionaryType1 = new Dictionary<KeyType1, string>();
dictionaryType1[new KeyType1(1)] = "Val1";
if(dictionaryType1.ContainsKey(new KeyType1(1)))
{
Debug.Log ("Key in dicType1 was already present"); //This line does NOT print
}
//Test a dictionary of type1
Dictionary<KeyType2, string> dictionaryType2 = new Dictionary<KeyType2, string>();
dictionaryType2[new KeyType2(1)] = "Val1";
if(dictionaryType2.ContainsKey(new KeyType2(1)))
{
Debug.Log ("Key in dicType2 was already present"); // Only this line prints
}
}
}
//This type implements only GetHashCode()
public class KeyType1
{
private int var1;
public KeyType1(int v1)
{
var1 = v1;
}
public override int GetHashCode ()
{
return var1;
}
}
//This type implements both GetHashCode() and Equals(obj), where Equals uses the hashcode.
public class KeyType2
{
private int var1;
public KeyType2(int v1)
{
var1 = v1;
}
public override int GetHashCode ()
{
return var1;
}
public override bool Equals (object obj)
{
return GetHashCode() == obj.GetHashCode();
}
}
タイプを使用する場合にのみ、KeyType2
キーは等しいと見なされます。私にとってこれは、DictionaryがGetHashCode()ではなくEquals(obj)を使用していることを示しています。
誰かがこれを再現して、意味を解釈するのを手伝ってもらえますか?モノラルでの誤った実装ですか?または私は何かを誤解しましたか。