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

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

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

Ответ 1

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

var lastItem = sortedDict.Values.Last();

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

var lastkey = sortedDict.Keys.Last();

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

var lastKeyValuePair = sortedDict.Last();

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

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

Ответ 2

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

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

  • Переключитесь на SortedList<K, V>. Опять же по какой-то причине BCL не упаковывает это по умолчанию. Вы можете использовать индексаторы для получения значения max (или min) в 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?

  • Напишите свой собственный класс 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). Не зарегистрировано, но я проверил код.

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

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

Ответ 3

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

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

SortedDictionary.Last();

Ответ 4

Список отсортированных списков...

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