取两个可以为空的值中的较大值

Pau*_*ner 23 c# nullable

假设我有两个可以为空的整数:

int? a = 10;
int? b = 20;
Run Code Online (Sandbox Code Playgroud)

我想取最大的非null值,这样如果两个值都为null,则结果为null.

我可以写一些啰嗦的东西,例如:

int? max;
if (a == null)
{
    max = b;
}
else if (b == null)
{
    max = a;
}
else
{
    max = a > b ? a : b;
}
Run Code Online (Sandbox Code Playgroud)

对于我的喜好,这感觉有点太笨重(并且可能容易出错).返回更大值的最简单方法是什么,这也是空值的可能性?

Nil*_*s O 71

在一行中使用null合并运算符:

int? c = a > b ? a : b ?? a;
Run Code Online (Sandbox Code Playgroud)


rom*_*oza 65

这适用于任何可以为空的:

Nullable.Compare(a, b) > 0 ? a : b;
Run Code Online (Sandbox Code Playgroud)

  • 挑衅最好的解决方案,所以+1,除了它显然不适用于**任何**可空... (2认同)
  • 我也查看了 `Nullable.Compare` 的行为,看看它做了什么。我发现这个解决方案比大多数(所有)其他解决方案可读性差,因为它需要查找文档才能理解。但是,我相信不同的人有不同的记忆,所以也许这就是我。 (2认同)

DrK*_*och 59

这些行显示了一个小技巧的必要逻辑:

if (a == null) return b; // handles b== null also
if (b == null) return a;
// now a!=null, b!=null
return Math.Max(a.Value, b.Value);
Run Code Online (Sandbox Code Playgroud)

或者在一行中使用?:(完全相同的逻辑)

 return a == null ? b : b == null ? a : Math.Max(a.Value, b.Value);
Run Code Online (Sandbox Code Playgroud)


编辑

虽然上面的答案对于教育目的而言很有意思,但并不是解决这个问题的推荐方法.推荐的方法是不重新发明轮子而是找到匹配的轮子:

正如@roman指出的那样,存在一种Nullable.Compare()方法可以使其更具可读性:

return Nullable.Compare(a, b) > 0 ? a : b;
Run Code Online (Sandbox Code Playgroud)

  • 可能已经使用Visual Studio 2015及其[静态`使用`](https://msdn.microsoft.com/en-us/magazine/dn683793.aspx). (4认同)
  • 你的意思是"Math.Max"吗? (2认同)
  • @WaiHaLee,我想我们应该等到VS2015完全发布. (2认同)

Ric*_*ick 42

这是Null合并运算符 的好地方??.
如果值不是null,则返回第一个值,否则返回第二个值.

int? c = a > b ? a : b ?? a;
Run Code Online (Sandbox Code Playgroud)

证明在这里

使用比较运算符将返回false任一值的事实,null表达式将为您提供所需的结果:

a        | b        || a>b | a   | b??a | a>b ? a : b??a
--------------------||----------------------------------
> b      | NOT NULL ||  T  | a   | --   | a
? b      | NOT NULL ||  F  | --  | b    | b
NOT NULL | NULL     ||  F  | --  | a    | a
NULL     | NOT NULL ||  F  | --  | b    | b
NULL     | NULL     ||  F  | --  | NULL | NULL
Run Code Online (Sandbox Code Playgroud)


use*_*107 20

简短版本是:

var result = new[] { a, b }.Max();
Run Code Online (Sandbox Code Playgroud)

  • 是的:) C#的主要目标是编写安全和短代码,而不是高性能代码.编译器完成剩下的工作.这里编译器创建一个int?数组,没有匿名类型.与其他方法相比,性能差于2倍.无论如何,如果你想编写高性能代码,尽量避免可以为空的类型. (15认同)
  • 虽然答案,你真的想分配一个匿名类型的单值数组,只是为了找出哪个是更大的? (4认同)

Ehs*_*jad 8

这个怎么样

 private int? Greater(int? a, int? b)
 {
   if(a.HasValue && b.HasValue)
    return a > b ? a : b;

   if(a.HasValue)
     return a;
   if(b.HasValue)
     return b;

   return null;
  }
Run Code Online (Sandbox Code Playgroud)

或者更简洁:

 private int? Greater(int? a, int? b)
 {
   if(a.HasValue && b.HasValue)
    return a > b ? a : b;

   return a.HasValue ? a : b;
  }
Run Code Online (Sandbox Code Playgroud)