Ottieni una chiave uguale a un oggetto da SortedDictionary?
-
14-11-2019 - |
Domanda
C'è un modo per recuperare una chiave da un ordinamento di ordinamento uguale a un determinato oggetto?Per illustrare, diciamo che creo un dizionario con un tipo di chiave immutabile e abbastanza memoria:
var dictionary = SortedDictionary<MyHugeType, int>();
var myEnormousKey = new MyHugeType();
dictionary[myEnormousKey] = 123;
.
Poi più tardi, faccio qualcosa del genere:
// This is a new instance, but it's identical to the previous key
var myIdenticalKey = new MyHugeType();
if(dictionary.ContainsKey(myIdenticalKey)) {
myIdenticalKey = dictionary.GetKeyEqualTo(myIdenticalKey);
}
// Use myIdenticalKey reference...
.
Ovviamente, ordinaredictionary non ha un metodo "GetKekequalto".Ma c'è un modo in cui potrei ottenere un effetto simile?Ciò avrebbe fondamentalmente l'effetto di stagando gli oggetti chiave pesanti in modo che le istanze identiche possano essere scartate.So che posso farlo usando la classe ordinaria recuperando l'indice della chiave e successivamente la sua istanza dell'oggetto corrispondente, ma le prestazioni di inserimento coerente di ordinamento potrebbero essere migliori per i miei usi.
A corto di Iterrating attraverso tutti i tasti del dizionario per cercare una partita o scrivere la mia classe BST, c'è un modo per raggiungere questa estremità con .NET è costruita in collezioni incorporato?
Soluzione
È possibile modificare il tuo oggetto oggetto da int a una struttura o classe contenente sia il valore che il tasto originale.Quindi per accedere alla chiave originale che puoi fare:
dictionary[myIdenticalKey].OriginalKey
.
E per il valore qualcosa come:
dictionary[myIdenticalKey].Value
. Altri suggerimenti
Se si sovrascrive Equals()
e GetHashCode()
in MyHugeType
con il codice che determina se due istanze sono le stesse, quindi non si ottiene tasti duplicati nel dizionario.È questo cosa intendi?
È possibile implementare l'interfaccia IEquatable
nella classe chiave.Lì si specifica quando due oggetti della classe sono uguali l'uno all'altro.Dopo aver semplicemente testato l'esistenza di una voce utilizzando ContainsKey
e quando restituisce true
è possibile ottenerlo utilizzando l'operatore []
.
È possibile fornire anche un'implementazione IComparer
per ottenere lo stesso risultato.