Получить последний элемент в 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) нежелательно, у вас есть несколько вариантов:
-
перейти к
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? -
написать свой собственный
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>
С5. У них естьFindMin
иFindMax
оба из которых O (log n)
можно использовать SortedDictionary.Values.Last();
или если вы хотите ключ и значение
SortedDictionary.Last();