Я думаю, что это является наиболее читаемым O (п) ответ с использованием стандартного LINQ
var max = results.Aggregate((l, r) => l.Value > r.Value ? l : r).Key;
редактировать:. объяснение CoffeeAddict
Aggregate
является LI Имя NQ для общеизвестной функциональной концепции Fold
Он перемещается по каждому элементу набора и применяет любую функцию, которую вы предоставляете. Здесь функция, которую я предоставляю, представляет собой функцию сравнения, которая возвращает большее значение. Пока цикл, Aggregate
запоминает результат возврата в последний раз, когда он вызвал мою функцию. Он подает это в мою функцию сравнения как переменную l
. Переменная r
является выбранным элементом.
Итак, после того, как агрегат зациклился на весь набор, он возвращает результат с самого последнего времени, когда он вызвал мою функцию сравнения. Затем я прочитал .Key
член из нее, потому что я знаю, что это запись словаря
Вот другой способ взглянуть на него [Я не гарантирую, что это компилирует;)]
var l = results[0];
for(int i=1; i<results.Count(); ++i)
{
var r = results[i];
if(r.Value > l.Value)
l = r;
}
var max = l.Key;
должен ли ваш словарь быть <двойной, строка> или в том, что в обратном направлении? – Stephan
Вы правы, это <строка, двойная>. Исправленный. –
Почему у вас есть. Выберите после чего? Я не настолько силен с LINQ, просто любопытно – PositiveGuy