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 回答
1

也许您应该考虑使用元组

var myDictionary = new Dictionary<Tuple<int,int>, string>(); 
myDictionary.Add(new Tuple<int,int>(3, 3), "haha1"); 
myDictionary.Add(new Tuple<int,int>(5, 5), "haha2"); 

根据MSDN, Tuple 对象Equals方法将使用两个 Tuple 对象的值

于 2020-11-18T15:02:39.257 回答
-2

如果您不关心实际散列,最简单的方法可能就是将数组转换为字符串。添加空格以避免数字加入。

dic.Add(String.Join(" ",a), "haha");
于 2020-11-08T00:56:35.213 回答