Получить последний элемент в SortedDictionary

Я вижу этот вопрос.

Как я могу получить последний элемент в SortedDictionary в .Net 3.5.

4 ответов


вы можете использовать LINQ:

var lastItem = sortedDict.Values.Last();

вы также можете получить Последний ключ:

var lastkey = sortedDict.Keys.Last();

вы даже можете получить последние пару ключ-значение:

var lastKeyValuePair = sortedDict.Last();

это даст вам KeyValuePair<TKey, TValue> С Key и Value свойства.

обратите внимание, что это вызовет исключение, если словарь пуст; если вы этого не хотите, вызовите LastOrDefault.


Last метод расширения даст вам результат, но он должен будет перечислить всю коллекцию, чтобы получить вас там. Это такой позор SortedDictionary<K, V> не подвергайте Min и Max члены, особенно учитывая, что внутри он поддерживается SortedSet<KeyValuePair<K, V>> имеющего Min и Max свойства.

если O (n) нежелательно, у вас есть несколько вариантов:

  1. перейти к SortedList<K, V>. Опять же, по какой-то причине BCL не упаковывает это по умолчанию. Вы можете использовать индексаторы, чтобы получить максимальное (или минимальное) значение за O(1) времени. Расширение с помощью методов расширения будет приятно.

    //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]);
    }
    

    SortedList<K, V> поставляется с другими штрафами. Таким образом, вы можете увидеть: в чем разница между SortedList и SortedDictionary?

  2. написать свой собственный SortedDictionary<K, V> класса. Это очень тривиально. Есть SortedSet<KeyValuePair<K, V>> как внутренний контейнер и основание сравнение на Key часть. Что-то например:

    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)
    }
    

    Это O (log n). Не задокументировано, но я проверил код.

  3. используйте fiddly reflection для доступа к набору поддержки, который является частным членом SortedDictionary<K, V> класса и вызвать Min и Max свойства. Можно полагаться на выражения для компиляции делегата и кэширования его для производительности. Это очень плохой выбор. Не могу поверить, что я это предложила.

  4. полагаться на другие реализации, например. Для TreeDictionary<K, V> С5. У них есть FindMin и FindMax оба из которых O (log n)


можно использовать SortedDictionary.Values.Last();

или если вы хотите ключ и значение

SortedDictionary.Last();

список парам...

list[ Keys[Keys.Count - 1] ];  // returns the last entry in list