字典键不能作为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>
,并且使用这种类型的密钥,它不起作用。
是否有其他可行的替代方案?
数组不可比较。例如:
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>>
的类。该类将为Tuple<int[], int>
提供Equals
和GetHashCode
方法。为您的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;
}
本文关键字: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>
,并且使用这种类型的密钥,它不起作用。
是否有其他可行的替代方案?
数组不可比较。例如:
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>>
的类。该类将为Tuple<int[], int>
提供Equals
和GetHashCode
方法。为您的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;
}