添加两个可空的整数不起作用

时间:2016-06-22 10:39:19

标签: c# nullable

我有一个非常奇怪的问题。问题看起来有趣而简单,但它让我很生气。

我在类中有一个可以为null的整数,声明为

public int? count { get; set; }

我有这个类的对象数组(additionalCell)和同一个类的另一个名为currentPixelTotalCell的对象。我想添加数组中所有对象的count变量的值,并将其存储在currentPixelTotalCell的count变量中。

我的代码如下。但是在调试时,我看到只有在退出循环后,左手部分的值才为null,尽管所有对象中的计数变量都具有非空值。

for(int i = 0; i < 5; i++)
{    
    currentPixelTotalCell.count += additionalCell[i].count;
}

知道为什么会这样吗?是否有不同的添加方式?我很无能为力。

编辑:

忘了提到这个。当我有断点并检查第一次迭代本身时,它不会加起来。 例如。如果additionalCell [0] .count为10.那么即使在第一次迭代中执行内部行之后,currentPixelTotalCell.count的值也只是为空。

6 个答案:

答案 0 :(得分:3)

是否需要先将currentPixelTotalCell.count变量初始化为0?

currentPixelTotalCell.count = 0;
for(int i = 0; i < 5; i++)
{    
    currentPixelTotalCell.count += additionalCell[i].count;
}

或者您可能必须在AdditionalCell对象中检查空值?

for(int i = 0; i < 5; i++)
{    
    currentPixelTotalCell.count += (additionalCell[i].count ?? 0)
}

答案 1 :(得分:2)

如果结果为null,则

  • currentPixelTotalCell.countnull
  • 其中一些additionalCell [i] .count是null

确保null都受到控制

   // currentPixelTotalCell.count is not null
   currentPixelTotalCell.count = 0;

   for(int i = 0; i < 5; i++)
   {    
       // if additionalCell[i].count is null treat it as 0
       currentPixelTotalCell.count += additionalCell[i].count ?? 0;
   }

您可以尝试 Linq 作为替代方案:

   currentPixelTotalCell.count = additionalCell
     .Take(5) // if you want take just first 5 items
     .Sum(item => item ?? 0);

答案 2 :(得分:2)

将内循环更改为:

x_tidy <- melt(x, measure.vars = grep("^colo", names(x)))
x_tidy[value == "yellow", max(score)]
#[1] 0.7

以避免在其中一个右手值为空时将总数设置为null。

答案 3 :(得分:1)

我猜结果是null,因为其中一个值为null

怎么样:

 currentPixelTotalCell.count += additionalCell.Select(x => x.count)
                                              .Where(x => x.HasValue)
                                              .Sum();

 currentPixelTotalCell.count += additionalCell.Sum(x => x.count ?? 0);

不要忘记在某处初始化currentPixelTotalCell.count或通过简单的作业+=替换=

答案 4 :(得分:1)

在访问之前,您需要将currentPixelTotalCell.count初始化为0。

请记住,“ a + = b ”只是“ a = a + b ”的语法糖。

因为a为null,所以你实际上在做“ a = null + b ”并且null加上等于null的东西。

同样由于相同的约束,您需要确保右侧的值也不为空。在您的情况下,更简单的方法是使用 GetValueOrDefault 方法。

所有这些都说,你的最终解决方案应该是:

currentPixelTotalCell.count = 0;
for(int i = 0; i < 5; i++)
{    
    currentPixelTotalCell.count += additionalCell[i].count.GetValueOrDefault();
}

答案 5 :(得分:0)

有一种名为.GetValueOrDefault()的方法,它会为您提供Nullable<T>的默认值。如果值为0

,您可以使用它来指定null
for(int i = 0; i < 5; i++)
{    
    currentPixelTotalCell.CmvF =currentPixelTotalCell.CmvF.GetValueOrDefault() +  additionalCell[i].CmvF.GetValueOrDefault();
}