我有一个非常奇怪的问题。问题看起来有趣而简单,但它让我很生气。
我在类中有一个可以为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的值也只是为空。
答案 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.count
为null
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();
}