据我所知,如果记录集为空,则linq方法FirstOrDefault()
将返回null
。为什么不能对函数使用??
运算符?像这样:
Double d = new Double[]{}.FirstOrDefault() ?? 0.0;
的更新
我不希望稍后在我的代码中检查d
是null
。做:
Double d new Double[]{}.FirstOrDefault() == null
? 0.0
: new Double[]{}.FirstOrDefault();
......或:
var r = new Double[]{}.FirstOrDefault();
Double d = r == null ? 0.0 : r;
...似乎有点矫枉过正 - 我想在一行代码中进行空值检查。
答案 0 :(得分:11)
答案 1 :(得分:10)
实际上,FirstOrDefault<T>()
会返回T,这是值或default(T)
。
default(T)
可以是null
或(T)0
(例如double
)
答案 2 :(得分:5)
该方法被称为FirstOrDefault而不是FirstOrNull,即它将返回0,无论如何都是double的默认值,因此不需要??。
答案 3 :(得分:1)
使nullable
成功。但是,那么你制作它nullable
,一切都取决于你的情景......
Double d = new Double?[] { }.FirstOrDefault() ?? 0.0;
答案 4 :(得分:0)
虽然其他人已经解答了为什么你在这里遇到编译问题,但你认为这对于值类型是有问题的。据我所知,在这种情况下无法知道零的结果是因为第一项真的是零,还是因为IEnumerable<double>
是空的。
在您给出的示例中,无论如何,回退值为零,因此您只需要:
var r = new double[]{...}.FirstOrDefault();
假设您有一个非零回退值,您有几个选项:
var r = !myDoubles.Any() ? fallback : myDoubles.First();
或
var r = myDoubles.Cast<double?>().FirstOrDefault() ?? fallback;
如果你有Zen Linq Extensions,你可以这样做:
var r = myDoubles.FirstOrFallback(fallback);