2010-08-30 5 views
27

Ho bisogno di aggiungere numerose variabili di tipo nullable int. Ho usato l'operatore null coalescente per portarlo a una variabile per riga, ma ho la sensazione che ci sia un modo più conciso per farlo, ad es. non riesco a collegare queste affermazioni in qualche modo, l'ho già visto in altri codici.C'è un modo più elegante per aggiungere valori nulli?

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(); 
     } 
    } 
} 

risposta

40
var nums = new int?[] {1, null, 3}; 
var total = nums.Sum(); 

Questa si basa sulla IEnumerable<Nullable<Int32>>overload del Enumerable.Sum metodo, che si comporta come ci si aspetterebbe.

Se si dispone di un default-valore che non è uguale a zero, si può fare:

var total = nums.Sum(i => i.GetValueOrDefault(myDefaultValue)); 

o la scorciatoia:

var total = nums.Sum(i => i ?? myDefaultValue);

+2

Semplice, conciso, e funziona con ciò che è già lì. +1 – stakx

+0

Il tuo approccio è migliore (rendimento saggio) rispetto al semplice fatto di 'int total = (sum1 ?? 0) + (sum2 ?? 0) + (sum3 ?? 0);'? Voglio dire, stai creando un array solo per sommare i loro valori. Influisce molto? Voglio solo sapere, anche se ho scritto per prima cosa un codice simile, e poi l'ho cercato ;-) –

18
total += sum1.GetValueOrDefault(); 

ecc

1

Come su metodo di supporto -

static int Sum(params int?[] values) 
{ 
    int total = 0; 
    for(var i=0; i<values.length; i++) { 
    total += values[i] ?? 0; 
    } 
    return total; 
} 

IMO, non molto elegante, ma almeno aggiungere i numeri che si desidera in un una sola volta.

total = Helper.Sum(sum1, sum2, sum3, ...); 
1

Si potrebbe fare

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

questo modo è possibile avere tanti valori che si desidera.

1

Come circa appena sostituendo (sumX ?? 0) per sumX in l'espressione corrispondente non nullable?

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

più semplice, l'utilizzo più elegante di LINQ:

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

è necessario l'AFAIK si fondono per assicurarsi che il risultato non è annullabile.

+0

Poiché le estensioni di Linq 'Sum' salta' nullo', puoi anche dire 'var sum = list.Sum() .Value' o 'var sum = list.Sum() ?? 0 '. –

9

Proprio per rispondere alla domanda più diretta:

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

In questo modo le dichiarazioni sono "incatenati" insieme come chiesto con un +

+0

Perfetto !! Questo è quello che stavo cercando ... –