2010-08-30 42 views
27

我需要添加许多类型为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(); 
     } 
    } 
} 

回答

40
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);

+2

简单,简洁,并与东西已经在那里工作。 +1 – stakx 2010-08-30 10:31:16

+0

你的方法比单纯执行'int total =(sum1 ?? 0)+(sum2 ?? 0)+(sum3 ?? 0)更好吗?我的意思是你创建一个数组只是为了总结它们的值。它影响很大吗?我只想知道,尽管我先写了类似的代码,然后再来搜索它;-) – 2017-02-05 05:57:52

18
total += sum1.GetValueOrDefault(); 

1

如何约helper方法 -

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, ...); 
1

你可以做

total += sum1 ?? 0; 
total += sum2 ?? 0; 
total += sum3 ?? 0; 
2
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); 

这样,只要你想,你可以有很多值。

1

如何只在替代(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(); 
     } 
    } 
} 
0

最简单,LINQ的最优雅的用法:

var list = new List<Nullable<int>> { 1, 2, null, 3 }; 
var sum = list.Sum(s => s ?? 0); 
Console.WriteLine(sum); 

您需要聚结据我所知,以确保结果不为空。

+0

由于Linq'Sum'扩展名跳过了'null'元素,所以您可以说'var sum = list.Sum() .Value'或'var sum = list.Sum()?? 0'。 – 2012-06-13 10:45:59

9

只是为了最直接地回答这个问题:

int total = (sum1 ?? 0) + (sum2 ?? 0) + (sum3 ?? 0); 

这种方式使用要求的语句“链接”在一起+

+0

完美!这就是我正在寻找的... – 2016-04-28 04:16:56

相关问题