2010-04-11 5 views
5

Ho bisogno di una struttura dati che si comporta come un SortedDictionary<int, double> ma è ordinata in base ai valori anziché alle chiavi. Ho bisogno di circa 1-2 microsecondi per aggiungere e rimuovere elementi quando abbiamo circa 3000 voci nel dizionario.. NET SortedDictionary But Sorted By Values ​​

Il mio primo pensiero è stato semplicemente quello di passare le chiavi e i valori nel mio codice. Questo quasi funziona. Facendo questo, posso aggiungere e rimuovere elementi in circa 1,2 microsecondi nei miei test.

Ma le chiavi devono essere univoche in un SortedDictionary quindi ciò significa che i valori nel mio dizionario inverso dovrebbero essere univoci. E ci sono alcuni casi in cui potrebbero non esserlo.

Qualche idea di qualcosa nelle librerie .NET già funzionante per me?

+0

Sto assumendo SortedList <> non soddisfa che le prestazioni? –

+0

Puoi spiegare cosa rappresentano le chiavi e i valori nel tuo dominio? –

+0

@Simon Penso che SortedList <> sia anche ordinato per chiavi. http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx –

risposta

1

La biblioteca PowerCollections ha una classe chiamata OrderedMultiDictionary<TKey, TValue> che è fondamentalmente come un SortedDictionary<TKey, TValue> ma consente duplicati. Quando cerchi una chiave, ottieni un enumerabile invece di un singolo valore.

La libreria è gratuita e dovresti essere in grado di fare esattamente quello che vuoi con quella classe - memorizzare i valori come chiavi.

+0

Wow, è grandioso! Fammi scaricare e vedere se fa 1-2 noi reale veloce. –

+0

Nota: se non vuoi usare quella libreria, puoi sempre implementarla tu stesso con un 'SortedDictionary', e semplicemente memorizzare un' List 'come valore invece di un singolo' T'. – Aaronaught

+0

Aggiungi/Rimuovi è di circa 30 microsecondi circa per la libreria PowerCollections. Abbastanza vicino, ma non sono sicuro se è abbastanza per questa app. Grazie per il puntatore però. Il SortedDictionary > è anche una buona idea, fammi vedere se posso farlo. Un altro pensiero che ho avuto è stato usare semplicemente il SortedDictionary aggiungere un minuscolo termine casuale di ordine .0000001 circa che costringerebbe i miei valori ad essere unici ma non influenzerà il risultato. –

3

È possibile ordinare SortedDictionary per valore in questo modo:

yourList.Sort(
    delegate(KeyValuePair<int, double> val1, 
    KeyValuePair<int, double> val2) 
    { 
     return val1.Value.CompareTo(val2.Value); 
    } 
); 
+0

Innovativo. Mi piace. – Armstrongest

Problemi correlati