有没有更优雅的方法来添加可为空的整数?
Posted
技术标签:
【中文标题】有没有更优雅的方法来添加可为空的整数?【英文标题】:Is there a more elegant way to add nullable ints? 【发布时间】:2011-04-05 16:36:54 【问题描述】:我需要添加大量可为 null 的 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();
【问题讨论】:
提供的解决方案的问题是空值之和为零。在某些情况下,您希望所有空值的总和为空。例如诠释?添加=空,更新=空,删除=空;诠释?总计 = 添加 + 更新 + 删除; // null 即什么都没做。 【参考方案1】:var nums = new int?[] 1, null, 3;
var total = nums.Sum();
这依赖于Enumerable.Sum
方法的IEnumerable<Nullable<Int32>>
overload ,其行为与您预期的一样。
如果你有一个不等于零的默认值,你可以这样做:
var total = nums.Sum(i => i.GetValueOrDefault(myDefaultValue));
或简写:
var total = nums.Sum(i => i ?? myDefaultValue);
【讨论】:
您的方法是否比简单地执行int total = (sum1 ?? 0) + (sum2 ?? 0) + (sum3 ?? 0);
更好(性能方面)?我的意思是你正在创建一个数组只是为了总结它们的值。影响大吗?我只是想知道,虽然我先写了完全相似的代码,然后来搜索它;-)
如果数组中全部为空,我希望总数为空。这样一来,总数为 0。【参考方案2】:
total += sum1.GetValueOrDefault();
等等
【讨论】:
【参考方案3】:只是为了最直接地回答问题:
int total = (sum1 ?? 0) + (sum2 ?? 0) + (sum3 ?? 0);
这样,语句被“链接”在一起,如使用 + 所要求的那样
【讨论】:
括号加一:-)【参考方案4】: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);
通过这种方式,您可以拥有任意数量的值。
【讨论】:
【参考方案5】:如何使用辅助方法 -
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, ...);
【讨论】:
【参考方案6】:你可以的
total += sum1 ?? 0;
total += sum2 ?? 0;
total += sum3 ?? 0;
【讨论】:
【参考方案7】:用(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();
【讨论】:
【参考方案8】:LINQ 最简单、最优雅的用法:
var list = new List<Nullable<int>> 1, 2, null, 3 ;
var sum = list.Sum(s => s ?? 0);
Console.WriteLine(sum);
您需要合并 AFAIK 以确保结果不可为空。
【讨论】:
由于 LinqSum
扩展跳过了null
元素,你也可以说var sum = list.Sum().Value
或var sum = list.Sum() ?? 0
。【参考方案9】:
如果数组中的所有数字都为空,我希望总数为空。
// 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;
【讨论】:
以上是关于有没有更优雅的方法来添加可为空的整数?的主要内容,如果未能解决你的问题,请参考以下文章