2010-08-30 2 views
27

Ich muss zahlreiche Variablen vom Typ Nullable Int hinzufügen. Ich benutzte den Null-Koaleszenzoperator, um es auf eine Variable pro Zeile zu reduzieren, aber ich habe das Gefühl, dass es einen prägnanteren Weg gibt, dies zu tun, z. kann ich diese Aussagen nicht irgendwie zusammenketten, habe ich das vorher in anderem Code gesehen.Gibt es eine elegantere Möglichkeit zum Hinzufügen von NULL-fähigen Ints?

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

Antwort

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

Dies beruht auf der IEnumerable<Nullable<Int32>>overload der Enumerable.Sum Methode, die wie erwartet verhält.

Wenn Sie einen Standardwert haben, der nicht gleich Null ist, können Sie tun:

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

oder die Kurz:

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

+2

einfach, prägnant gefragt, und es funktioniert mit dem, was schon da ist. +1 – stakx

+0

Ist Ihre Herangehensweise besser (leistungsbezogener) als einfach "int total = (sum1 ?? 0) + (sum2 ?? 0) + (sum3 ?? 0);'? Ich meine, Sie erstellen ein Array, nur um ihre Werte zu summieren. Betrifft es viel? Ich möchte es nur wissen, obwohl ich zuerst genau den gleichen Code geschrieben habe und dann danach gesucht habe ;-) –

18
total += sum1.GetValueOrDefault(); 

usw.

1

Wie über Hilfsmethode -

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

IMO, nicht sehr elegant, aber zumindest fügen Sie so viele Zahlen wie Sie in einem einmal wollen.

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

Sie könnten

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

diese Art und Weise tun, können Sie so viele Werte, wie Sie wollen.

1

Wie wäre es nur (sumX ?? 0) für sumX Substitution in der entsprechende nicht nullbare Ausdruck?

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

Simplest, eleganteste Verwendung von LINQ:

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

Sie müssen die coalesce AFAIK, um sicherzustellen, ist das Ergebnis nicht auf NULL festlegbare.

+0

Da die Linq 'Sum' Erweiterungen' null' Elemente überspringen, kann man auch 'var sum = list.Sum() sagen .Value' oder 'var sum = list.Sum() ?? 0'. –

9

einfach die Frage am unmittelbarsten zu beantworten:

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

Auf diese Weise der Aussagen „verkettet“ werden zusammen als mit a +

+0

Perfekt !! Das habe ich gesucht ... –

Verwandte Themen