24

整数の配列をキーとして使用する辞書が必要で、整数配列が同じ値 (異なるオブジェクト インスタンスであっても) の場合、それらは同じキーとして扱われます。どうすればいいですか?

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];
4

3 に答える 3

43

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());

注:ここで取得したハッシュコードの計算: オーバーライドされたSystem.Object.GetHashCodeに最適なアルゴリズムは何ですか?

于 2013-02-02T15:07:52.017 に答える