2010-08-30 19 views
27

Necesito agregar numerosas variables de tipo nullable int. Usé el operador nulo coalescente para bajarlo a una variable por línea, pero tengo la sensación de que hay una forma más concisa de hacerlo, p. no puedo encadenar estas declaraciones juntas de alguna manera, lo he visto antes en otro código.¿Hay alguna manera más elegante de agregar entradas anulables?

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

Respuesta

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

Esto se basa en la IEnumerable<Nullable<Int32>>overload del Método Enumerable.Sum, que se comporta como era de esperar.

Si usted tiene un valor predeterminado que no es igual a cero, puede hacerlo:

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

o la forma abreviada:

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

+2

simple, concisa, y funciona con lo que ya existe. +1 – stakx

+0

¿Es mejor su enfoque (en cuanto al rendimiento) que simplemente hacer 'int total = (sum1 ?? 0) + (sum2 ?? 0) + (sum3 ?? 0);'? Quiero decir que estás creando una matriz solo para sumar sus valores. ¿Afecta mucho? Solo quiero saber, aunque primero escribí un código similar, y luego lo busqué ;-) –

18
total += sum1.GetValueOrDefault(); 

etc.

1

Cómo sobre método de ayuda -

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

OMI, no muy elegante, pero al menos añadir tantos números como desee en una sola vez.

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

Usted podría hacer

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

esta manera usted puede tener tantos valores como desee.

1

¿Qué tal sustitución (sumX ?? 0) para sumX en la expresión correspondiente no anulable?

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

más simple, el uso más elegante de LINQ:

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

Se necesita el yo sepa se unen para asegurarse de que el resultado no es anulable.

+0

Como las extensiones de 'Suma 'de Linq omiten elementos' null', también puede decir 'var sum = list.Sum() .Value' o 'var sum = list.Sum() ?? 0'. –

9

Sólo para responder a la pregunta más directa:

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

De esta manera las declaraciones están "encadenados" juntos como pedido utilizando un +

+0

¡Perfecto! Esto es lo que estaba buscando... –

Cuestiones relacionadas