Как использовать linq для нахождения минимума [дубликат]

Этот вопрос уже имеет ответ здесь:

У меня есть a class A { public float Score; ... } и IEnumerable items и хотел бы найти A который имеет минимальный счет.

Используя items.Min(x => x.Score) дает минимальный счет а не экземпляр с минимальным счетом.

Как я могу получить экземпляр путем итерации только однажды через мои данные?

Править: Так долго существует три основных решения:

42
задан Danvil 29 April 2010 в 11:54
поделиться

7 ответов

Взгляните на метод расширения MinBy в MoreLINQ (созданный Джоном Скитом, теперь в основном поддерживаемый Атифом Азизом).

14
ответ дан 26 November 2019 в 23:24
поделиться

Быстрый способ, как я вижу, это реализация IComparable для вашего класса A (если возможно, конечно)

class A : IComparable<A>

Это простая реализация, в которой вы пишете CompareTo (A other) посмотрите IEnumerable (of T) .Min в MSDN , чтобы получить справочное руководство

4
ответ дан 26 November 2019 в 23:24
поделиться

Небольшая складка должна помочь:

var minItem = items.Aggregate((acc, c) => acc.Score < c.Score? acc : c);

Ах ... слишком медленно.

3
ответ дан 26 November 2019 в 23:24
поделиться

Это можно решить с помощью небольшой простой итерации:

float minScore = float.MaxValue;
A minItem = null;

foreach(A item in items)
{
   if(item.Score < minScore)
       minItem = item;
}

return minItem;

Это нехороший запрос LINQ, но он избегает операции сортировки и выполняет итерацию списка только один раз в соответствии с требованиями вопроса.

7
ответ дан 26 November 2019 в 23:24
поделиться

Джейми Пенни получил мой голос. Вы также можете сказать

items.OrderBy(s => s.Score).Take(1);

, что имеет тот же эффект. Используйте Take (5), чтобы взять наименьшие 5 и т. Д.

2
ответ дан 26 November 2019 в 23:24
поделиться

Использовать агрегирование:

items.Aggregate((c, d) => c.Score < d.Score ? c : d)

Как предлагается, точная та же строка с более понятными именами:

items.Aggregate((minItem, nextItem) => minItem.Score < nextItem.Score ? minItem : nextItem)
65
ответ дан 26 November 2019 в 23:24
поделиться

Попробуйте items.OrderBy (s => s.Score) .FirstOrDefault ();

22
ответ дан 26 November 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: