Получить первый отсортированный элемент с помощью 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();
Извините, я не мог просто комментировать, я новый участник. Вы должны использовать вместо этого ответ Ани, потому что он прав, что он идет быстрее.