我需要添加许多类型无效的变量。我使用零合并操作员将其降低到每个行变量,但是我觉得有一种更简洁的方法可以做到这一点,例如我不能以某种方式将这些陈述链接在一起,我以前在其他情况下看到过这些陈述代码。

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();
        }
    }
}
有帮助吗?

解决方案

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

其他提示

total += sum1.GetValueOrDefault();

等等

只是直接回答这个问题:

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

这样,使用A +,陈述被“链接”在一起

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

这样,您可以拥有想要的数量。

如何处理辅助方法 -

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

你可以做

total += sum1 ?? 0;
total += sum2 ?? 0;
total += sum3 ?? 0;

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

Linq的最简单,最优雅的用法:

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

您需要Colesce afaik来确保结果不可能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top