Я вижу этот вопрос.
Как я могу получить последний элемент в SortedDictionary в .Net 3.5.
Я вижу этот вопрос.
Как я могу получить последний элемент в SortedDictionary в .Net 3.5.
Вы можете использовать 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) нежелательно, у вас есть несколько вариантов:
Переключитесь на 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)
Вы можете использовать SortedDictionary.Values.Last();
или если вы хотите, чтобы ключ и значение
SortedDictionary.Last();
Список отсортированных списков...
list[ Keys[Keys.Count - 1] ]; // returns the last entry in list