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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top