【问题标题】:Keep null when adding Nullable int?添加Nullable int时保持null?
【发布时间】:2018-08-16 18:25:44
【问题描述】:

我想添加可为空的int? 并在所有值均为null 时保留null

我想要这个结果:

1 + 2 = 3
1 + null = 1
null + null = null
O + null = 0

问题是,如果我将一个值与 null 相加,结果是 null

int? i1 = 1;
int? i2 = null;
int? total = i1 + i2; // null

我看过这个帖子: Is there a more elegant way to add nullable ints?

使用 linq:

var nums = new int?[] {null, null, null};
var total = nums.Sum(); // 0

我得到 0,我想要 null...

我发现的唯一方法是制作一个函数:

static int? Sum(params int?[] values)
{
  if (values.All(item => !item.HasValue))
    return null;
  else
    return values.Sum();
}

我有办法在本地做到这一点吗?

【问题讨论】:

  • 好吧,写一个方法也不错:)
  • 为它创建自己的类型和运算符以及 linq 函数。
  • 我不明白链接副本中的哪个答案解决了这个问题。这是OP链接到的线程,所以他们已经清楚地阅读了它。有人可以让我摆脱痛苦吗?
  • OP 明确表示他们希望null + null 成为null,而不是0,这就是我感到困惑的原因。谁在乎 OP 的推理是什么,这是他们所要求的。
  • 我同意 OP 想要的东西闻起来很糟糕,但我看不出行为上的矛盾。他们说如果所有值都是null,他们希望总和为null,在任何其他情况下,将null 视为0。对我来说似乎很简单。我不明白重复项如何回答场景 OP 卡在 null + null = null 而不是 0 上。我是否异常密集?

标签: c# nullable


【解决方案1】:

一个选项可能是使用Aggregate 的扩展方法。比如:

public static int? NullableSum(this IEnumerable<int?> values)
{
    return values.Aggregate((int?)null, (sum, value)   
        => value.HasValue ? (sum ?? 0) + value : sum + 0);
}

在功能方面,它的作用与您的自定义 Sum 方法大致相同,无需两次遍历数组。

本质上它将初始值设置为null,但一旦它看到anynull值,它就开始将null值视为0。

因此,如果 所有 输入都是 null,它会返回 null - 否则它的行为方式与 LINQ 的 Sum 基本相同。

【讨论】:

  • 好的,我会用你的更高效的替换我的函数
猜你喜欢
  • 2012-02-11
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多