Есть ли более элегантный способ добавления целых чисел, допускающих значение NULL?

Мне нужно добавить множество переменных типа int, допускающего значение NULL. Я использовал оператор объединения с нулевым значением, чтобы свести его к одной переменной в строке, но у меня есть ощущение, что есть более сжатый способ сделать это, например, нельзя как-то связать эти операторы вместе, я видел это раньше в других код.

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();
        }
    }
}
34
задан Edward Tanguay 30 August 2010 в 10:06
поделиться

7 ответов

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

Это зависит от перегрузки IEnumerable> метода Enumerable.Sum , который ведет себя так, как и следовало ожидать.

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

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

или сокращенно:

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

52
ответ дан 27 November 2019 в 16:14
поделиться
total += sum1.GetValueOrDefault();

и т. д.

22
ответ дан 27 November 2019 в 16:14
поделиться

Как насчет вспомогательного метода -

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
ответ дан 27 November 2019 в 16:14
поделиться

Можно было бы

total += sum1 ?? 0;
total += sum2 ?? 0;
total += sum3 ?? 0;
1
ответ дан 27 November 2019 в 16:14
поделиться

Как насчет того, чтобы просто заменить (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(); 
        } 
    } 
} 
1
ответ дан 27 November 2019 в 16:14
поделиться

Простейшее и наиболее элегантное использование LINQ:

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

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

0
ответ дан 27 November 2019 в 16:14
поделиться
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);

Таким образом, вы можете иметь столько значений, сколько захотите.

2
ответ дан 27 November 2019 в 16:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: