Есть ли более элегантный способ добавить nullable ints?
Мне нужно добавить многочисленные переменные типа nullable 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();
}
}
}
Ответы
Ответ 1
var nums = new int?[] {1, null, 3};
var total = nums.Sum();
Это зависит от IEnumerable<Nullable<Int32>>
перегрузки Enumerable.Sum
Метод, который ведет себя так, как вы ожидали.
Если у вас есть значение по умолчанию, которое не равно нулю, вы можете сделать:
var total = nums.Sum(i => i.GetValueOrDefault(myDefaultValue));
или сокращенное обозначение:
var total = nums.Sum(i => i ?? myDefaultValue);
Ответ 2
total += sum1.GetValueOrDefault();
и др.
Ответ 3
Просто чтобы ответить на вопрос наиболее непосредственно:
int total = (sum1 ?? 0) + (sum2 ?? 0) + (sum3 ?? 0);
Таким образом, операторы "цепями" вместе задаются с помощью +
Ответ 4
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);
таким образом вы можете иметь столько значений, сколько хотите.
Ответ 5
Как о вспомогательном методе -
static int Sum(params int?[] values)
{
int total = 0;
for(var i=0; i<values.length; i++) {
total += values[i] ?? 0;
}
return total;
}
IMO, не очень элегантный, но, по крайней мере, добавить столько чисел, сколько захотите за один раз.
total = Helper.Sum(sum1, sum2, sum3, ...);
Ответ 6
Вы могли бы сделать
total += sum1 ?? 0;
total += sum2 ?? 0;
total += sum3 ?? 0;
Ответ 7
Как насчет просто подстановки (sumX ?? 0)
для sumX
в соответствующем не-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();
}
}
}
Ответ 8
Простейшее, наиболее элегантное использование LINQ:
var list = new List<Nullable<int>> { 1, 2, null, 3 };
var sum = list.Sum(s => s ?? 0);
Console.WriteLine(sum);
Вам нужен coalece AFAIK, чтобы убедиться, что результат не может быть нулевым.