2010-08-30 4 views
27

Мне нужно добавить многочисленные переменные типа nullable int. Я использовал нулевой оператор коалесцирования, чтобы получить его до одной переменной на строку, но у меня есть ощущение, что есть более сжатый способ сделать это, например. не могу я как-то связать эти утверждения, я видел это раньше в другом коде.Есть ли более элегантный способ добавления nullable 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(); 
     } 
    } 
} 

ответ

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

Это зависит от IEnumerable<Nullable<Int32>>overload от Enumerable.Sum метода, который ведет себя, как и следовало ожидать.

Если у вас есть по умолчанию-значение, которое не равно нулю, то вы можете сделать:

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

или стенографии:

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

+2

Простой, лаконичный, и она работает с тем, что уже есть. +1 – stakx

+0

Является ли ваш подход лучше (производительность мудрый), чем просто выполнение 'int total = (sum1 ?? 0) + (sum2 ?? 0) + (sum3 ?? 0);'? Я имею в виду, что вы создаете массив, чтобы суммировать их значения. Это сильно влияет? Я просто хочу знать, хотя сначала написал точно такой же код, а затем начал его искать ;-) –

18
total += sum1.GetValueOrDefault(); 

т.д.

1

Как насчет хелперов метода -

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

ИМО, не очень элегантно, но по крайней мере, добавить столько, сколько вам нужно в один присест.

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

Вам нужен Coalesce AFAIK, чтобы убедиться, что результат не обнуляемым.

+0

Поскольку строки Linq 'Sum' пропускают элементы' null', вы также можете сказать 'var sum = list.Sum() .Value' или 'var sum = list.Sum() ?? 0'. –

9

Просто, чтобы ответить на этот вопрос самым непосредственным образом:

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

Таким образом, эти заявления «прикован» вместе спросил с помощью +

+0

Отлично !! Это то, что я искал ... –

Смежные вопросы