Получить первый отсортированный элемент с помощью LINQ? (С #)

Во-первых, взгляните на этот код:

Dictionary<int,int> dict = Dictionary<int,int>();
dict[3] = 1;
dict[2] = 2;
dict[1] = 3;

foreach(KeyValuePair<int,int> item in dict.OrderByDescending(p => p.Value))
{
    print(item.Value);
    break;
}

Этот код, в основном, печатает значение записи в словаре с наибольшим значением. Я хотел бы сделать это без использования "сломанной" foreach петля. Как я могу это сделать?

2 ответа

Решение

Ну, вы могли бы сделать:

if(dict.Any())
   print(dict.Values.Max());

Это не только более кратко, но и не требует сортировки словаря неуместно вначале (что и является началом перечисления вOrderByDescending делает), поэтому более эффективен как во времени, так и в пространстве.

Если вам также нужен ключ, вы можете использовать MaxBy оператор (например, из moreLinq) следующим образом:

if(dict.Any())
{
    var bestKvp = dict.MaxBy(kvp => kvp.Value);
    Console.WriteLine("Key = {0}, Value = {1}", bestKvp.Key, bestKvp.Value);
}

Это можно сделать с помощью стандартного LINQ to Objects в O(n) время и O(1) пространство с Aggregate оператор, но это довольно некрасиво

if(dict.Any())
{
    var bestKvp = dict.Aggregate((bestSoFar, next) => bestSoFar.Value > next.Value ? bestSoFar : next );
    Console.WriteLine("Key = {0}, Value = {1}", bestKvp.Key, bestKvp.Value);
}

Я по большей части доволен ответом Ани. Тем не менее, я хочу указать на First<T>() а также Last<T>() Функции LINQ.

var value = dict.OrderByAscending(pair => pair.Value).First();

Извините, я не мог просто комментировать, я новый участник. Вы должны использовать вместо этого ответ Ани, потому что он прав, что он идет быстрее.

Другие вопросы по тегам