Я могу использовать Словарь C# по классам как массивы??
Dictionary<double[],double[]>
Я боюсь, что это не сможет сказать, когда массивы будут равны...
Править:
Будет метод хеширования в словаре проявлять хорошо заботу за массивами? или просто хешировав их ссылки?
Для ключей массива словарь будет использовать ссылки для хеширования и равенства, что, вероятно, не то, что вам нужно. Это оставляет вам два варианта: реализовать класс-оболочку для double []
или (лучше) написать что-нибудь, реализующее IEqualityComparer
, и передать его в Dictionary
конструктор.
Сравниваются только ссылки на массивы. В следующем примере в словаре будет 2 записей, хотя массивы a и b имеют одинаковое количество записей и значения записей равны:
double[] a = new[] { 1.0, 2.1, 3.2 };
double[] b = new[] { 1.0, 2.1, 3.2 };
Dictionary<double[], double[]> d = new Dictionary<double[], double[]>();
d[a] = new [] { 1.1 };
d[b] = new [] { 2.2 };
Console.WriteLine(d.Count);
Console.WriteLine(d[b][0]);
Я не думаю, что иметь массив в качестве ключа - хорошая идея, особенно если он большой и если ваша логика равенства основана на содержимом массива. Потому что каждый раз, когда вы будете вызывать 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
. Конечно, вы можете захотеть добавить некоторые методы или свойства к обертке (например, реализовать IList
)