【问题标题】:Is there a more elegant way to add nullable ints?有没有更优雅的方法来添加可为空的整数?
【发布时间】:2011-04-05 16:36:54
【问题描述】:

我需要添加大量可为 null 的 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();
        }
    }
}

【问题讨论】:

  • 提供的解决方案的问题是空值之和为零。在某些情况下,您希望所有空值的总和为空。例如诠释?添加=空,更新=空,删除=空;诠释?总计 = 添加 + 更新 + 删除; // null 即什么都没做。

标签: c# nullable null-coalescing-operator


【解决方案1】:
var nums = new int?[] {1, null, 3};
var total = nums.Sum();

这依赖于Enumerable.Sum 方法的IEnumerable<Nullable<Int32>>overload ,其行为与您预期的一样。

如果你有一个不等于零的默认值,你可以这样做:

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

或简写:

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

【讨论】:

  • 您的方法是否比简单地执行int total = (sum1 ?? 0) + (sum2 ?? 0) + (sum3 ?? 0); 更好(性能方面)?我的意思是你正在创建一个数组只是为了总结它们的值。影响大吗?我只是想知道,虽然我先写了完全相似的代码,然后来搜索它;-)
  • 如果数组中全部为空,我希望总数为空。这样一来,总数为 0。
【解决方案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 怎么样?

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

            您需要合并 AFAIK 以确保结果不可为空。

            【讨论】:

            • 由于 Linq Sum 扩展跳过了null 元素,你也可以说var sum = list.Sum().Valuevar sum = list.Sum() ?? 0
            【解决方案9】:

            如果数组中的所有数字都为空,我希望总数为空。

            // 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;
            }
            

            【讨论】:

              猜你喜欢
              • 2015-10-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-11-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-12-10
              相关资源
              最近更新 更多