decimal val=dataRow.AsEnumerable().Sum(s=>s.Field<decimal>("Quantity"));
если столбец содержит нуль он поднимает Exception.so я хочу вернуться к нулю вместо ExceptionC# Lambda Выражение Суммирование Исключение
decimal val=dataRow.AsEnumerable().Sum(s=>s.Field<decimal>("Quantity"));
если столбец содержит нуль он поднимает Exception.so я хочу вернуться к нулю вместо ExceptionC# Lambda Выражение Суммирование Исключение
попробовать
decimal val=dataRow.AsEnumerable().Sum(s=>s.Field<decimal>("Quantity")??0);
Вы могли бы сначала разобрать поле, а затем подвести :
decimal val = dataRow.AsEnumerable()
.Select(s => s.Field<decimal?>("Quantity"))
.Where(s => s != null)
.Sum(s => s) ?? 0.0m;
Обратите внимание, что я использовал десятичный символ, поэтому код действительно может обрабатывать нули. Также я использовал оператор coalesce, потому что Sum вернет null, когда перечисление пусто.
decimal val=dataRow.AsEnumerable().Sum(s=> s["Quantity"] == DBNull.Value ? 0M : s.Field<decimal>("Quantity"));
согласно документации http://msdn.microsoft.com/en-us/library/bb360891(v=vs.110).aspx расширение поля набора данных уже возвращает нуль в тех случаях, когда значение равно нулю, но он поддерживает только NULLABLE ссылочные типы. не поддерживает типы с нулевым значением, такие как десятичные? Он выдает исключение при анализе десятичной дроби.
Таким образом, вам необходимо вручную проверять поле DBNull и затем набрасывать его. Обычно он возвращает DBNull, но расширение уже обрабатывает это.
Таким образом, вы можете просто проверить на Null в выражении LinQ как этот
decimal val=dataRow.AsEnumerable().Sum(s=> s["Quantity"] == DBNull.Value ? 0M : s.Field<decimal>("Quantity"));
, как отправленный Дмитрий Руденко
Чтение спецификации, это говорит 'Кроме того, DataSet не поддерживает типы с нулевым значением. Метод Field обеспечивает поддержку для доступа к столбцам как типы с нулевым значением. '- поэтому вы не можете иметь значение« decimal »в« DataSet », но вы можете вызывать« Поле
вправо, это имеет смысл, поэтому вы могли бы фактически проверить сумму с помощью 'Sum (s => s.Field
Да, это волшебство! :) – Rawling
Вы можете попробовать это:
decimal val = dataRow.AsEnumerable().Sum(s =>
{
var field = s.Field<object>("Quantity");
return field == null ? 0 : (decimal) field;
});
, но самый простой способ это просто допускать допустимое значение десятичной величины
decimal val = dataRow.AsEnumerable().Sum(s => s.Field<decimal?>("Quantity") ?? 0);
Согласно spec для Enumerable.Sum<Nullable<decimal>>
,
Этот метод возвращает нуль, если источник не содержит элементов.
В результате не указаны значения null.
Таким образом, казалось бы, что все нулевые чеки, coalsesces и условными люди используют не нужны, и все, что вам нужно, это
decimal val = dataRow.AsEnumerable()
.Sum(s=>s.Field<decimal?>("Quantity"))
.Value;
Я высоко предположить, что '' поле возвратит ' decimal', который в любом случае не может быть нулевым. –
user2674389
@ user2674389 ссылается на ответ MichaC –
Фактически. Поле («Количество») возвращает исключение синтаксического анализа, если значение столбца равно null, см. Мой «новый» ответ ... –
MichaC