Что самый опрятный путь состоит в том, чтобы достигнуть “MinOrDefault” в Linq?

Я произвожу список десятичных значений от linq выражения, и я хочу минимум не нулевое значение. Однако совершенно возможно, что linq выражение приведет к пустому списку.

Это повысит исключение и нет никакого MinOrDefault для преодоления этой ситуации.

decimal result = (from Item itm in itemList
                  where itm.Amount > 0
                  select itm.Amount).Min();

Что самый опрятный путь состоит в том, чтобы установить результат на 0, если список пуст?

75
задан Chris Simpson 29 January 2010 в 22:22
поделиться

2 ответа

decimal? result = (from Item itm in itemList
                  where itm.Amount != 0
                  select (decimal?)itm.Amount).Min();

Обратите внимание на преобразование в десятичное число? . Вы получите пустой результат, если нет (просто обрабатывать, что после того, как этот факт - я в основном иллюстрирую, как остановить исключение). Я также сделал «ненулевое» использование ! = , а не > .

51
ответ дан 24 November 2019 в 11:33
поделиться

Что вы хотите:

IEnumerable<double> results = ... your query ...

double result = results.MinOrDefault();

Ну, Minordefault () не существует. Но если бы мы должны были реализовать это, это будет выглядеть что-то подобное:

public static class EnumerableExtensions
{
    public static T MinOrDefault<T>(this IEnumerable<T> sequence)
    {
        if (sequence.Any())
        {
            return sequence.Min();
        }
        else
        {
            return default(T);
        }
    }
}

Однако в

public static class EnumerableExtensions
{
    public static T MinOrDefault<T>(this IEnumerable<T> sequence)
    {
        if (sequence.Any())
        {
            return sequence.Min();
        }
        else
        {
            return default(T);
        }
    }
}

есть функциональность в System.linq , которые будут создавать тот же результат (немного по-другому):

double result = results.DefaultIfEmpty().Min();

Если результаты не содержат никаких элементов, Defaultfulty () будет создавать последовательность, содержащую один элемент - по умолчанию (T) - который вы впоследствии можете вызвать Min () на.

Если по умолчанию (T) не то, что вы хотите, то вы можете указать свой собственный по умолчанию с:

double myDefault = ...
double result = results.DefaultIfEmpty(myDefault).Min();

сейчас, это аккуратно!

119
ответ дан 24 November 2019 в 11:33
поделиться
Другие вопросы по тегам:

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