C#Lambda表达式求和异常

时间:2013-11-16 09:09:21

标签: c#

decimal val=dataRow.AsEnumerable().Sum(s=>s.Field<decimal>("Quantity"));

如果列包含null,则会引发Exception.so我想返回零而不是Exception

6 个答案:

答案 0 :(得分:1)

根据文档http://msdn.microsoft.com/en-us/library/bb360891(v=vs.110).aspx,对于Value为null但仅支持可空引用类型的情况,数据集的Field扩展已经返回null。 它不支持十进制等可空类型吗?解析小数时会抛出异常。

因此,您必须手动检查字段的DBNull,然后进行转换。 通常它会返回DBNull,但扩展已经处理了。

所以你可以简单地在linq表达式中检查Null,就像这样

decimal val=dataRow.AsEnumerable().Sum(s=> s["Quantity"] == DBNull.Value ? 0M : s.Field<decimal>("Quantity"));

由Dmytro Rudenko发布

答案 1 :(得分:0)

尝试

decimal val=dataRow.AsEnumerable().Sum(s=>s.Field<decimal>("Quantity")??0);

答案 2 :(得分:0)

你可以先解析Field,然后求它:

decimal val = dataRow.AsEnumerable()
                     .Select(s => s.Field<decimal?>("Quantity"))
                     .Where(s => s != null)
                     .Sum(s => s) ?? 0.0m;

请注意我使用了十进制?,因此代码实际上可以处理空值。我还使用了coalesce运算符,因为当枚举为空时Sum将返回null。

答案 3 :(得分:0)

decimal val=dataRow.AsEnumerable().Sum(s=> s["Quantity"] == DBNull.Value ? 0M : s.Field<decimal>("Quantity"));

答案 4 :(得分:0)

你可以试试这个:

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);

答案 5 :(得分:0)

根据Enumerable.Sum<Nullable<decimal>>的{​​{3}},

  

如果 source 不包含任何元素,则此方法返回零。

     

结果不包含 null 的值。

因此,似乎人们使用的所有空检查,煤炭和条件都是不必要的,而且你需要的只是

decimal val = dataRow.AsEnumerable()
    .Sum(s=>s.Field<decimal?>("Quantity"))
    .Value;