non ritengo avente una matrice come chiave è una buona idea, specialmente se è grande e se la tua logica di uguaglianza è basata sul contenuto dell'array. Perché ogni volta che chiamerai il numero GetHashCode
, dovrà eseguire calcoli sull'intero array, che può richiedere del tempo se l'array è grande ...
Una soluzione sarebbe quella di avvolgere l'array in una classe che memorizzerebbe il codice hash fino a quando i dati vengono modificati, in modo che non viene ricalcolato ogni volta:
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;
}
}
}
così il dizionario sarebbe una Dictionary<ArrayWrapper<double>, ArrayWrapper<double>>
. Naturalmente, potresti voler aggiungere alcuni metodi o proprietà al wrapper (ad esempio, implementare IList<T>
)
fonte
2010-05-25 21:14:07
Se puoi soddisfare la mia curiosità, qual è l'esigenza aziendale di avere la chiave come matrice? –
sto raccogliendo coppia di ingresso-uscita (di grandi dimensionalità) in un problema di classificazione, in cui le coppie ripetuti vengono mediati in qualche modo prima dell'allenamento classificatore ... – Betamoo