2013-02-02 7 views
9

整数の配列をキーとして使用するディクショナリを持ち、整数の配列が同じ値(異なるオブジェクトインスタンスでも)を持つ場合、それらは同じキーとして扱われます。私はどうすればいいのですか?ディクショナリのキーとしての整数配列

bが異なるオブジェクトインスタンスであるため、次のコードは機能しません。

int[] a = new int[] { 1, 2, 3 }; 
int[] b = new int[] { 1, 2, 3 }; 
Dictionary<int[], string> dic = new Dictionary<int[], string>(); 
dic.Add(a, "haha"); 
string output = dic[b]; 
+1

重複:http://stackoverflow.com/questions/3383534/dictionary-with-integer-array-as-a-keyこれは、リストと関連しています。 –

答えて

20

IEqualityComparerを作成して、辞書とアイテムの比較方法を定義することができます。項目の順序が関連している場合、このような作業をする必要があります:

public class MyEqualityComparer : IEqualityComparer<int[]> 
{ 
    public bool Equals(int[] x, int[] y) 
    { 
     if (x.Length != y.Length) 
     { 
      return false; 
     } 
     for (int i = 0; i < x.Length; i++) 
     { 
      if (x[i] != y[i]) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 

    public int GetHashCode(int[] obj) 
    { 
     int result = 17; 
     for (int i = 0; i < obj.Length; i++) 
     { 
      unchecked 
      { 
       result = result * 23 + obj[i]; 
      } 
     } 
     return result; 
    } 
} 

を使用すると、辞書作成すると、それを渡す:

Dictionary<int[], string> dic 
    = new Dictionary<int[], string>(new MyEqualityComparer()); 

注:ここで得られたハッシュコードの計算: What is the best algorithm for an overridden System.Object.GetHashCode?

+0

GetHashCode以外の理由があるのはなぜですかEqual演算子ですか? – william007

+2

@ william007 'Dictionary <,>'はそのキーのハッシュテーブルを保持しているので、新しい 'Equals'を尊重する' GetHashCode'が必要です。同じ理由で、 'IEqualityComparer <>'インターフェースは 'GetHashCode'を必要とします。 –

+3

なぜそれを** 'My' **' EqualityComparer'と呼んでいますか?それがあなたのものであるという事実は無関係です。 'IntArrayEqualityComparer'などと呼ばれるべきである) – BartoszKP

関連する問題