Найти максимум по полю

244
02 февраля 2018, 19:01
public class LogTime
{
    public uint TotalMs { get; protected set; }
    // и другие
}
LogTime GetMax(List<LogTime> Times)
{
    if (Times == null) return null;
    LogTime logMax = Times[0]
    foreach (var t in Times)
    {
        if( t.TotalMs > logMax.TotalMs)
            logMax = t;
    }
    retutn logMax;
}

Как сделать ф-цию красивее?

Answer 1

Подключите NuGet-пакет morelinq, тогда можно будет написать так:

LogTime GetMax(List<LogTime> Times) => Times?.MaxBy(t => t.TotalMs);

MoreEnumerable.MaxBy

Answer 2

Можно воспользоваться методом Aggregate, это позволит свернуть последовательность в один элемент:

LogTime GetMax(List<LogTime> Times)
{
    return Times?.Aggregate(Times.FirstOrDefault(), (a, b) => a.TotalMs > b.TotalMs ? a : b);
}

Также можно сделать более общее решение, напоминающее .MaxBy, для этого нужно сделать данную функцию расширением для IEnumerable<T>

public static class Ext
{
    public static T GetMax<T, TProp>(this IEnumerable<T> source, Func<T, TProp> fun) where TProp : IComparable<TProp> => source.Any() ? source.Aggregate(source.FirstOrDefault(), (a, b) => fun(a).CompareTo(fun(b)) > 0 ? a : b) : default;
}

Тогда ее можно будет вызывать аналогично соседнему ответу:

Times.GetMax(t => t.TotalMs)
READ ALSO
Разделение изображения на части [требует правки]

Разделение изображения на части [требует правки]

Добрый вечерРебят помогите разбить изображение 600x600 на квадраты 150x150

218
Обработчик закрытия приложения

Обработчик закрытия приложения

Нужен event handler или любой другой способ получать состояние приложения, когда оно закрываетсяПриложение без форм или консоли

201
Почему хранимая процедура при вызове из C# кода выполняется в 18 раз дольше чем на сервере?

Почему хранимая процедура при вызове из C# кода выполняется в 18 раз дольше чем на сервере?

Есть хранимая процедура в MS SQL базеВ SQL Server Managment Studio она выполняется всего за 10 секунд

221
unity зависает Application.Quit

unity зависает Application.Quit

при вызове метода ApplicationQuit - зависает игра на 3-4 секунды и только потом закрывается, иногда у некоторых перезапускается

210