我需要添加许多 nullable int 类型的变量。我使用空合并运算符将其简化为每行一个变量,但我感觉有一种更简洁的方法可以做到这一点,例如我不能以某种方式将这些语句链接在一起吗?我之前在其他代码中已经看到过。
using System;
namespace TestNullInts
{
class Program
{
static void Main(string[] args)
{
int? sum1 = 1;
int? sum2 = null;
int? sum3 = 3;
//int total = sum1 + sum2 + sum3;
//int total = sum1.Value + sum2.Value + sum3.Value;
int total = 0;
total = total + sum1 ?? total;
total = total + sum2 ?? total;
total = total + sum3 ?? total;
Console.WriteLine(total);
Console.ReadLine();
}
}
}
var nums = new int?[] {1, null, 3};
var total = nums.Sum();
IEnumerable<Nullable<Int32>>
方法的 Enumerable.Sum
重载 ,其行为正如您所期望的那样。
如果您的默认值不等于零,您可以这样做:
var total = nums.Sum(i => i.GetValueOrDefault(myDefaultValue));
或简写:
var total = nums.Sum(i => i ?? myDefaultValue);
total += sum1.GetValueOrDefault();
等等
直接回答问题:
int total = (sum1 ?? 0) + (sum2 ?? 0) + (sum3 ?? 0);
这样,语句就按照使用+的要求“链接”在一起
List<Nullable<int>> numbers = new List<Nullable<int>>();
numbers.Add(sum1);
numbers.Add(sum2);
numbers.Add(sum3);
int total = 0;
numbers.ForEach(n => total += n ?? 0);
这样你就可以拥有任意数量的值。
如何了解辅助方法 -
static int Sum(params int?[] values)
{
int total = 0;
for(var i=0; i<values.length; i++) {
total += values[i] ?? 0;
}
return total;
}
IMO,不是很优雅,但至少一次性添加尽可能多的数字。
total = Helper.Sum(sum1, sum2, sum3, ...);
你可以做
total += sum1 ?? 0;
total += sum2 ?? 0;
total += sum3 ?? 0;
在相应的不可空表达式中将
(sumX ?? 0)
替换为 sumX
怎么样?
using System;
namespace TestNullInts
{
class Program
{
static void Main(string[] args)
{
int? sum1 = 1;
int? sum2 = null;
int? sum3 = 3;
int total = 0;
total += (sum1 ?? 0) + (sum2 ?? 0) + (sum3 ?? 0);
Console.WriteLine(total);
Console.ReadLine();
}
}
}
LINQ 最简单、最优雅的用法:
var list = new List<Nullable<int>> { 1, 2, null, 3 };
var sum = list.Sum(s => s ?? 0);
Console.WriteLine(sum);
您需要合并 AFAIK 以确保结果不可为空。
如果数组中的所有数字都为空,我希望总数为空。
// E.g.
int? added = null, updated = null, deleted = null;
...
int? total = added + updated + deleted; // null i.e. nothing has been done.
测试用例
Sum(new int?[] { null, null}).Dump(); // null
Sum(new int?[] { 1, null}).Dump(); // 1
Sum(new int?[] { null, 2}).Dump(); // 2
Sum(new int?[] { 1, 2}).Dump(); // 3
实施示例
int? Sum(int?[] numbers)
{
int? total = null;
for (int i = 0; i < numbers.Length; i++)
{
int? item = numbers[i];
if (item != null)
{
if (total == null)
{
total = item;
}
else
{
total += item;
}
}
}
return total;
}
也许不完全相同的问题,但这是我的解决方案
返回所有非空值的总和(在 + 运算中,空值获胜)
如果所有值都为空则返回 null(而 sum 将返回 0)
私有静态双精度? Sum(params double?[] 值) { 返回值。Any(d => d.HasValue) ?值.Sum(d => d) : null; }