我有一种情况,我需要一个这种类型的密钥字典,但它似乎没有找到等效的密钥。
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>
并且使用这种类型的密钥,它不会工作
还有其他替代方案吗?
答案 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[]
替换为实现必要的Equals
和GetHashCode
覆盖的自定义类。
2)编写一个实现IEqualityComparer<Tuple<int[], int>>
的类。该课程将为Equals
提供GetHashCode
和Tuple<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;
}