【问题标题】:Ignoring NaN from summation从求和中忽略 NaN
【发布时间】:2025-12-18 20:10:02
【问题描述】:

我想总结 10 个双变量,但是其中一些变量可能包含“NaN”。有没有办法从总和中忽略带有“NaN”的那些。现在我有一个像下面这样的简单添加,但是它为 SumLiq.. 变量分配了一个“NaN”值。

double SumLiqPerTimeStamp = l2_msg.size0 + l2_msg.size1 + l2_msg.size2 + l2_msg.size3
                           +l2_msg.size4 + l2_msg.size5 + l2_msg.size6 + l2_msg.size7 +  l2_msg.size8 + l2_msg.size9;

有没有一种快速有效的方法来检查“NaN”,而无需对每个都执行 if 语句?

【问题讨论】:

    标签: c# nan


    【解决方案1】:

    如果输入为 NaN,则使用返回零的扩展方法:

    public static double Value(this double input)
    {
        return input == Double.NaN ? 0 : input;
    }
    

    然后将您的值相加为

    var sum = l2_msg.size0.Value() + l2_msg.size1.Value() + ...
    

    【讨论】:

      【解决方案2】:

      在你的msg类型中添加一个属性Size,它会在返回之前检查值,如果是NaN则返回0。

      【讨论】:

      • 我无法编辑类,这是我用于供应商产品@Eugene Sh 的 api。
      • 你总是可以做一个包装,但它可能是一个超调。
      【解决方案3】:

      N也许你可以把它们放在一个数组中并得到Sum()

      double SumLiqPerTimeStamp = new double[]{ l2_msg.size0 , l2_msg.size1 , l2_msg.size2 , l2_msg.size3
                             ,l2_msg.size4 , l2_msg.size5 , l2_msg.size6 , l2_msg.size7 ,  l2_msg.size8 , l2_msg.size9 }.Where( x => !double.IsNaN(x) ).Sum();
      

      【讨论】: