Ottieni l'ultimo elemento in SortedDictionary
-
06-07-2019 - |
Domanda
Vedo questa domanda .
Come posso ottenere l'ultimo elemento in un SortedDictionary in .Net 3.5.
Soluzione
Puoi usare LINQ:
var lastItem = sortedDict.Values.Last();
Puoi anche ottenere l'ultima chiave:
var lastkey = sortedDict.Keys.Last();
Puoi persino ottenere l'ultima coppia chiave-valore:
var lastKeyValuePair = sortedDict.Last();
Questo ti darà un KeyValuePair<TKey, TValue>
con Key
e Value
proprietà.
Nota che ciò genererà un'eccezione se il dizionario è vuoto; se non lo desideri, chiama LastOrDefault
.
Altri suggerimenti
Last
ti darà il risultato, ma dovrà enumerare l'intera raccolta per arrivarci. È un peccato che SortedDictionary<K, V>
non esponga Min
e Max
membri soprattutto considerando internamente che è supportato da un SortedSet<KeyValuePair<K, V>>
che ha SortedList<K, V>
e Key
proprietà.
Se O (n) non è desiderabile, hai alcune opzioni:
-
Passa a
TreeDictionary<K, V>
. Ancora una volta per qualche motivo BCL non impacchetta questo per impostazione predefinita. È possibile utilizzare gli indicizzatori per ottenere il valore massimo (o minimo) in O (1) tempo. L'estensione con i metodi di estensione sarà piacevole.//Ensure you dont call Min Linq extension method. public KeyValuePair<K, V> Min<K, V>(this SortedList<K, V> dict) { return new KeyValuePair<K, V>(dict.Keys[0], dict.Values[0]); //is O(1) } //Ensure you dont call Max Linq extension method. public KeyValuePair<K, V> Max<K, V>(this SortedList<K, V> dict) { var index = dict.Count - 1; //O(1) again return new KeyValuePair<K, V>(dict.Keys[index], dict.Values[index]); }
FindMin
include altre penalità. Quindi potresti voler vedere: Qual è la differenza tra SortedList e SortedDictionary? -
Scrivi la tua classe
FindMax
. Questo è molto banale. Avere un <=> come contenitore interno e basare il confronto sulla parte <=>. Qualcosa del tipo:public class SortedDictionary<K, V> : IDictionary<K, V> { SortedSet<KeyValuePair<K, V>> set; //initialize with appropriate comparer public KeyValuePair<K, V> Min { get { return set.Min; } } //O(log n) public KeyValuePair<K, V> Max { get { return set.Max; } } //O(log n) }
Questo è O (log n). Non documentato, ma ho controllato il codice.
-
Usa la riflessione fiddly per accedere al set di supporto che è membro privato della classe <=> e invoca le proprietà <=> e <=>. Si può fare affidamento sulle espressioni per compilare un delegato e memorizzarlo nella cache per le prestazioni. È una pessima scelta farlo. Non posso credere di averlo suggerito.
-
Affidati ad altre implementazioni, ad es. Per <=> da C5 . Hanno <=> e <=> entrambi i quali sono O (log n)
Puoi usare SortedDictionary.Values.Last();
o se si desidera la chiave e il valore
SortedDictionary.Last();
Elenco SortedList ...
list[ Keys[Keys.Count - 1] ]; // returns the last entry in list