41

nullable int 型の変数を多数追加する必要があります。null 合体演算子を使用して 1 行あたり 1 つの変数に減らしましたが、これを行うためのより簡潔な方法があると感じています。コード。

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

9 に答える 9

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

于 2010-08-30T10:20:08.640 に答える
28
total += sum1.GetValueOrDefault();

于 2010-08-30T10:09:21.667 に答える
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);

このようにして、必要な数の値を持つことができます。

于 2010-08-30T10:16:52.143 に答える
1

対応するnull許容でない式を置き換えるだけではどう(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(); 
        } 
    } 
} 
于 2010-08-30T10:25:24.167 に答える
1

ヘルパーメソッドについて -

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, ...);
于 2010-08-30T10:12:34.350 に答える
1

あなたができる

total += sum1 ?? 0;
total += sum2 ?? 0;
total += sum3 ?? 0;
于 2010-08-30T10:14:35.517 に答える
0

LINQの最も単純で最もエレガントな使用法:

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

結果がnull許容されないようにするには、合体AFAIKが必要です。

于 2010-08-30T10:27:23.457 に答える
0

配列内のすべての数値が null の場合、合計が null になると予想されます。

// E.g. 
int? added = null, updated = null, deleted = null; 
...
int? total = added + updated + deleted; // null i.e. nothing has been done.

テストケース

Sum(new int?[] { null, null}).Dump(); // null   
Sum(new int?[] { 1, null}).Dump();    // 1
Sum(new int?[] { null, 2}).Dump();    // 2
Sum(new int?[] { 1, 2}).Dump();       // 3

サンプル実装

int? Sum(int?[] numbers)
{
    int? total = null;

    for (int i = 0; i < numbers.Length; i++)
    {
        int? item = numbers[i];
        if (item != null)
        {
            if (total == null)
            {
                total = item;
            }
            else
            {
                total += item;
            }
        }
    }
    
    return total;
}
于 2020-11-18T21:17:04.217 に答える