假设我有两个可以为空的整数:
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)
对于我的喜好,这感觉有点太笨重(并且可能容易出错).返回更大值的最简单方法是什么,这也是空值的可能性?
rom*_*oza 65
这适用于任何可以为空的:
Nullable.Compare(a, b) > 0 ? a : b;
Run Code Online (Sandbox Code Playgroud)
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)
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)
这个怎么样
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)
| 归档时间: |
|
| 查看次数: |
6447 次 |
| 最近记录: |