Получить первый отсортированный элемент с помощью LINQ? (С #) - PullRequest
3 голосов
/ 14 января 2012

Сначала взгляните на этот код:

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 ]

9 голосов
/ 14 января 2012

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

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);
}
1 голос
/ 16 января 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...