Я думаю, що це найбільш читабельна відповідь O (n) із використанням стандартного LINQ.
var max = results.Aggregate((l, r) => l.Value > r.Value ? l : r).Key;
редагувати: пояснення для CoffeeAddict
Aggregate
- це назва LINQ для загальновідомої функціональної концепції 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;