C# Lambda 表达式求和异常


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

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

根据文档 http://msdn.microsoft.com/en-us/library/bb360891(v=vs.110).aspx数据集的字段扩展在值为 null 的情况下已返回 null,但它仅支持可为 null 的引用类型。它不支持像十进制这样的可为空的类型?它将在解析小数时引发异常。

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

因此,您可以像这样简单地在 linq 表达式中检查 Null

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

正如德米特罗·鲁坚科发布的那样

尝试

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;

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

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

你可以试试这个:

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

根据Enumerable.Sum<Nullable<decimal>>的规范,

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

结果不包括值。

因此,人们使用的所有空检查、合并和条件似乎都是不必要的,您所需要的只是

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

最新更新