C# 添加可为null的int时是否保留null?
我想添加可为null的C# 添加可为null的int时是否保留null?,c#,nullable,C#,Nullable,我想添加可为null的int?并在所有值都为null时保留null 我希望得到以下结果: 1 + 2 = 3 1 + null = 1 null + null = null O + null = 0 问题是,如果我将一个值与null相加,结果就是null int? i1 = 1; int? i2 = null; int? total = i1 + i2; // null 我看到了这条线索: 林克: var nums = new int?[] {null, null, null}; var
int?
并在所有值都为null
时保留null
我希望得到以下结果:
1 + 2 = 3
1 + null = 1
null + null = null
O + null = 0
问题是,如果我将一个值与null相加,结果就是null
int? i1 = 1;
int? i2 = null;
int? total = i1 + i2; // null
我看到了这条线索:
林克:
var nums = new int?[] {null, null, null};
var total = nums.Sum(); // 0
我得到0,我想要空值
我找到的唯一方法是创建一个函数:
static int? Sum(params int?[] values)
{
if (values.All(item => !item.HasValue))
return null;
else
return values.Sum();
}
有没有一种方法可以在本地实现这一点?一个选项可能是使用
聚合的扩展方法。比如:
public static int? NullableSum(this IEnumerable<int?> values)
{
return values.Aggregate((int?)null, (sum, value)
=> value.HasValue ? (sum ?? 0) + value : sum + 0);
}
公共静态int?NullableSum(此IEnumerable值)
{
返回值。聚合((int?)null,(总和,值)
=>value.HasValue?(总和0)+值:总和+0);
}
从功能角度看,它与您的自定义Sum
方法做的事情基本相同,无需在数组中迭代两次
本质上,它将初始值设置为null
,但一旦看到任何非null
值,它就开始将null
值视为0
因此,如果所有的输入都是null
,它将返回null
——否则它的行为基本上与LINQ的Sum
相同一个选项可能是使用Aggregate
的扩展方法。比如:
public static int? NullableSum(this IEnumerable<int?> values)
{
return values.Aggregate((int?)null, (sum, value)
=> value.HasValue ? (sum ?? 0) + value : sum + 0);
}
公共静态int?NullableSum(此IEnumerable值)
{
返回值。聚合((int?)null,(总和,值)
=>value.HasValue?(总和0)+值:总和+0);
}
从功能角度看,它与您的自定义Sum
方法做的事情基本相同,无需在数组中迭代两次
本质上,它将初始值设置为null
,但一旦看到任何非null
值,它就开始将null
值视为0
因此,如果所有的输入都是null
它将返回null
——否则它的行为基本上与LINQ的Sum
相同。好吧,编写一个方法不是一个坏方法:)为它创建自己的类型、运算符和LINQ函数。我不知道链接副本中的哪个答案解决了这个问题。这是OP链接到的线程,所以他们已经清楚地阅读了它。有人能帮我摆脱痛苦吗?OP明确地说他们希望null+null
成为null
,而不是被当作0
,这就是我感到困惑的原因。谁在乎老年退休金计划的理由是什么,这是他们要求的。我同意老年退休金计划想要的东西闻起来很难闻,但我看不出行为上的矛盾。他们说,如果所有值都是null
,他们希望总和是null
,在任何其他情况下,将null
视为0
。对我来说似乎很简单。我不明白副本是如何回答场景OP的,它是null+null=null
而不是0
。我是否异常密集?好吧,编写方法不是一个坏方法:)为它创建自己的类型、运算符和linq函数。我不知道链接副本中的哪个答案解决了这个问题。这是OP链接到的线程,所以他们已经清楚地阅读了它。有人能帮我摆脱痛苦吗?OP明确地说他们希望null+null
成为null
,而不是被当作0
,这就是我感到困惑的原因。谁在乎老年退休金计划的理由是什么,这是他们要求的。我同意老年退休金计划想要的东西闻起来很难闻,但我看不出行为上的矛盾。他们说,如果所有值都是null
,他们希望总和是null
,在任何其他情况下,将null
视为0
。对我来说似乎很简单。我不明白副本是如何回答场景OP的,它是null+null=null
而不是0
。我是不是异常密集?好吧,我会用你的函数替换我的函数,你的函数效率更高。我会用你的函数替换我的函数,你的函数效率更高