字典键不能作为Tuple <int [],int =“”> </int [],>的类型工作

时间:2014-03-28 19:40:15

标签: c# dictionary

我有一种情况,我需要一个这种类型的密钥字典,但它似乎没有找到等效的密钥。

Dictionary<Tuple<int[], int>, object> cache = new Dictionary<Tuple<int[], int>, object>();

cache.Add(Tuple.Create(new int[]{1}, 1), new object());

Assert.That(cache.ContainsKey(Tuple.Create(new int[] { 1 }, 1))); // This fails

我已经使用Tuple<int, int>对其进行了测试,它似乎工作正常,但在我的情况下,我确实需要某种Tuple<int[], int>并且使用这种类型的密钥,它不会工作

还有其他替代方案吗?

2 个答案:

答案 0 :(得分:9)

阵列无法比较。例如:

var array1 = new int[] { 1 };
var array2 = new int[] { 1 };
Debug.WriteLine(array1 == array2); // this returns false
Debug.WriteLine(Object.Equals(array1, array2)) // this returns false

您需要做以下两件事之一:

1)将int[]替换为实现必要的EqualsGetHashCode覆盖的自定义类。

2)编写一个实现IEqualityComparer<Tuple<int[], int>>的类。该课程将为Equals提供GetHashCodeTuple<int[], int>方法。为您的Dictionary<Tuple<int[], int>, object>

提供该班级的实例

答案 1 :(得分:0)

您无法将数组与==can use this code

进行比较
 static bool ArraysEqual<T>(T[] array1, T[] array2)
    {
        if (ReferenceEquals(array1,array2))
            return true;

        if (array1 == null || array2 == null)
            return false;

        if (array1.Length != array2.Length)
            return false;

        EqualityComparer<T> comparer = EqualityComparer<T>.Default;
        for (int i = 0; i < array1.Length; i++)
        {
            if (!comparer.Equals(array1[i], array2[i])) return false;
        }
        return true;
    }