2010-08-30 45 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

相關問題