no creo que tiene una disposición como la clave es una buena idea, especialmente si es grande y si su lógica de igualdad se basa en el contenido de la matriz. Porque cada vez que llame al GetHashCode
, tendrá que realizar cálculos en toda la matriz, lo que puede llevar algo de tiempo si la matriz es grande ...
Una solución sería envolver la matriz en una clase que almacenaría el código hash hasta que los datos se modifica, por lo que no se vuelve a calcular cada vez que:
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;
}
}
}
lo tanto su diccionario sería un Dictionary<ArrayWrapper<double>, ArrayWrapper<double>>
. Por supuesto, es posible que desee agregar algunos métodos o propiedades al contenedor (implemente IList<T>
por ejemplo)
Si pudiera satisfacer mi curiosidad, ¿cuál es la necesidad comercial de tener la clave como una matriz? –
Estoy recopilando un par de entrada-salida (de gran dimensionalidad) en un problema de clasificación, donde los pares repetidos se promedian de alguna manera antes del clasificador de entrenamiento ... – Betamoo