К сожалению, нет встроенного способа сделать это, но действительно легко написать метод расширения для этого.
Это было в одном из моих самых первых сообщений в блоге , на самом деле ... обратите внимание, что в одном из комментариев есть лучшая реализация. Я перенесу это в тело, если у меня будет время.
РЕДАКТИРОВАТЬ: Хорошо, у меня есть несколько сокращенная версия - он просто возвращает максимальный элемент, используя данный селектор. Также не нужно делать прогноз - делайте это один раз после этого, если вам нужно. Обратите внимание, что вы можете удалить ограничение на TValue
и использовать вместо него Comparer<TValue>.Default
, либо иметь перегрузку, которая позволяет указать сравнение в качестве другого параметра.
public static TSource MaxBy<TSource, TValue>(this IEnumerable<TSource> source,
Func<TSource, TValue> selector)
where TValue : IComparable<TValue>
{
TValue maxValue = default(TValue);
TSource maxElement = default(TSource);
bool gotAny = false;
foreach (TSource sourceValue in source)
{
TValue value = selector(sourceValue);
if (!gotAny || value.CompareTo(maxValue) > 0)
{
maxValue = value;
maxElement = sourceValue;
gotAny = true;
}
}
if (!gotAny)
{
throw new InvalidOperationException("source is empty");
}
return maxElement;
}
Пример использования: (вывод типа примечания):
string maxName = models.MaxBy(model => model.Name.Length).Name;