Я вижу этот вопрос.
Как я могу получить последний элемент в 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