Я произвожу список десятичных значений от linq выражения, и я хочу минимум не нулевое значение. Однако совершенно возможно, что linq выражение приведет к пустому списку.
Это повысит исключение и нет никакого MinOrDefault для преодоления этой ситуации.
decimal result = (from Item itm in itemList
where itm.Amount > 0
select itm.Amount).Min();
Что самый опрятный путь состоит в том, чтобы установить результат на 0, если список пуст?
decimal? result = (from Item itm in itemList
where itm.Amount != 0
select (decimal?)itm.Amount).Min();
Обратите внимание на преобразование в десятичное число?
. Вы получите пустой результат, если нет (просто обрабатывать, что после того, как этот факт - я в основном иллюстрирую, как остановить исключение). Я также сделал «ненулевое» использование ! =
, а не >
.
Что вы хотите:
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();
сейчас, это аккуратно!