Получить последний элемент в 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();