2010-08-30 11 views
27

Potrzebuję dodać wiele zmiennych typu nullable int. Użyłem operatora koalescencyjnego zerowego, aby ustawić go w jednej zmiennej na linię, ale mam wrażenie, że jest to bardziej zwięzły sposób, np. nie mogę jakoś połączyć tych stwierdzeń, widziałem to wcześniej w innym kodzie.Czy istnieje bardziej elegancki sposób dodawania zerowej liczby 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(); 
     } 
    } 
} 

Odpowiedz

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

ta opiera się na IEnumerable<Nullable<Int32>>overload metody Enumerable.Sum, która zachowuje się jak można by oczekiwać.

Jeśli masz domyślną wartość, która nie jest równa zeru, można zrobić:

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

lub skrót:

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

+2

Prosty, zwięzły i działa z tym, co już tam jest. +1 – stakx

+0

Czy Twoje podejście jest lepsze (z punktu widzenia wydajności) niż po prostu "int total = (sum1 ?? 0) + (sum2 ?? 0) + (sum3 ?? 0);"? Chodzi mi o to, że tworzysz tablicę, by zsumować swoje wartości. Czy to ma wpływ na wiele? Po prostu chcę wiedzieć, chociaż najpierw napisałem dokładnie taki sam kod, a potem wyszedłem go szukając ;-) –

18
total += sum1.GetValueOrDefault(); 

itp

1

Jak o metodzie pomocnika -

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

IMO, niezbyt eleganckie, ale przynajmniej dodać dowolną liczbę numerów, jak chcesz w jednym zamachem.

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

Można zrobić

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

W ten sposób można mieć wiele wartości, jak chcesz.

1

Jak o właśnie zastąpienie (sumX ?? 0) dla sumX w odpowiadające wyrażenie nie-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

najprostszy, najbardziej elegancki wykorzystanie LINQ:

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

Musisz AFAIK zlewają się upewnić, że wynik nie jest pustych.

+0

Od elementów Linq 'Sum' pominąć' null' elementów, możesz także powiedzieć 'var sum = list.Sum() .Value' lub 'var sum = list.Sum() ?? 0'. –

9

Wystarczy odpowiedzieć na pytanie najbardziej bezpośrednio:

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

ten sposób wypowiedzi są „przykuty” razem jako zadawane za pomocą +

+0

Perfect !! Tego właśnie szukałem ... –

Powiązane problemy