Как использовать LINQ для выбора объекта с минимальным или максимальным значением свойства

К сожалению, для этого нет .cs-file встроенного метода, но его .cs-file достаточно легко реализовать c-sharp самостоятельно. Вот его суть:

public static TSource MinBy(this IEnumerable source,
    Func selector)
{
    return source.MinBy(selector, null);
}

public static TSource MinBy(this IEnumerable source,
    Func selector, IComparer comparer)
{
    if (source == null) throw new ArgumentNullException("source");
    if (selector == null) throw new ArgumentNullException("selector");
    comparer ??= Comparer.Default;

    using (var sourceIterator = source.GetEnumerator())
    {
        if (!sourceIterator.MoveNext())
        {
            throw new InvalidOperationException("Sequence contains no elements");
        }
        var min = sourceIterator.Current;
        var minKey = selector(min);
        while (sourceIterator.MoveNext())
        {
            var candidate = sourceIterator.Current;
            var candidateProjected = selector(candidate);
            if (comparer.Compare(candidateProjected, minKey) < 0)
            {
                min = candidate;
                minKey = candidateProjected;
            }
        }
        return min;
    }
}

Пример c#-language использования:

var firstBorn = People.MinBy(p => p.DateOfBirth ?? DateTime.MaxValue);

Обратите внимание, что c#-language это вызовет исключение, если visual-c# последовательность пуста, и c#-language вернет элемент first с минимальным visual-c# значением, если их больше dotnet одного.

В качестве альтернативы dotnet вы можете использовать реализацию, которую csharp мы получили в MoreLINQ, в MinBy.cs. (Конечно, есть c# соответствующий MaxBy.)

Установить visual-c# через консоль диспетчера linq-query-syntax пакетов:

PM> Установочный .cs-file пакет morelinq

c#

.net

linq

2022-11-21T05:40:36+00:00
Вопросы с похожей тематикой, как у вопроса:

Как использовать LINQ для выбора объекта с минимальным или максимальным значением свойства