字典键不能作为Tuple

本文关键字:int lt 类型 字典 不能 Tuple | 更新日期: 2023-09-27 17:54:50

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

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>,并且使用这种类型的密钥,它不起作用。

是否有其他可行的替代方案?

字典键不能作为Tuple<int[], int& lt;类型

数组不可比较。例如:

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>>的类。该类将为Tuple<int[], int>提供EqualsGetHashCode方法。为您的Dictionary<Tuple<int[], int>, object>

提供该类的实例

您不能将数组与==进行比较,您可以使用以下代码:

 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;
    }