Я не думаю, что иметь массив в качестве ключа - это хорошая идея, особенно если он большой и ваша логика равенства основана на содержимом массива. Потому что каждый раз, когда вы будете вызывать GetHashCode
, ему придется выполнять вычисления для всего массива, что может занять некоторое время, если массив большой ...
Решением было бы заключить массив в класс, который будет хранить хеш-код до тех пор, пока данные не будут изменены, чтобы он не пересчитывался каждый раз:
class ArrayWrapper<T>
{
private T[] _array;
public ArrayWrapper(T[] array)
{
_array = array;
}
private int? _hashcode;
public override int GetHashCode()
{
if (!_hashcode.HasValue)
{
_hashcode = ComputeHashCode();
}
return _hashcode.Value;
}
public override bool Equals(object other)
{
// Your equality logic here
}
protected virtual int ComputeHashCode()
{
// Your hashcode logic here
}
public int Length
{
get { return _array.Length; }
}
public T this[int index]
{
get { return _array[index]; }
set
{
_array[index] = value;
// Invalidate the hashcode when data is modified
_hashcode = null;
}
}
}
Таким образом, ваш словарь будет Dictionary<ArrayWrapper<double>, ArrayWrapper<double>>
. Конечно, вы можете захотеть добавить некоторые методы или свойства в оболочку (например, реализовать IList<T>
)