与十进制模式匹配总是失败,可以使用可为空的十进制累加器

时间:2017-12-20 09:21:14

标签: c#

是什么导致sum始终为null

object[] data = new object[]
{
    2.2M,
    3m,
    1,
    "string",
    true,
    false,
    2.3f
};

decimal? sum = null;
foreach (object x in data)
{
    if (x is decimal d)
        sum += d;
}

2 个答案:

答案 0 :(得分:4)

这里最简单的选择是使用null coalsecing运算符??

decimal? sum = null;
foreach (object x in data)
{
    if (x is decimal d)
        sum = (sum ?? 0) + d;
}

但你也可以使用LINQ:

var elements = data.OfType<decimal>();
decimal? sum = (elements.Any() ? (decimal?)elements.Sum() : null);

答案 1 :(得分:4)

为什么不是专门为此设计的好的 Linq

  object[] data = new object[] {
    2.2M,
    3m,
    1,
   "string",
    true,
    false,
    2.3f };

  // If you want 2.2m + 3m == 5.2  
  var sum = data
    .OfType<decimal?>() // we want decimal only: 2.2M as well as 3m
    .Sum();             // summed up    

修改:如果您想在空的过滤集合上获取null(而不是0m)(即当集合没有时)任何decimal个项目我们必须修改聚合:

  var sum = data
    .OfType<decimal?>()
    .Aggregate((decimal?)null, 
               (s, a) => s == null ? a : s + a);