Domanda

Vedo questa domanda .

Come posso ottenere l'ultimo elemento in un SortedDictionary in .Net 3.5.

È stato utile?

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

Il metodo di estensione

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:

  1. 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?

  2. 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.

  3. 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.

  4. 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top