当FirstOrDefault()
返回null时,我有以下LINQ查询触发和异常。理想情况下,我想避免空检查。有没有办法做到这一点?如果没有符合0
电话的CPOffsets
,我希望返回FirstOrDefault()
。
double offset = OrderedOffsets.FirstOrDefault(o => o.OffsetDateTime > cpTime).CPOffset;
我能看到实现这一目标的唯一方法如下:
CPOffset cpOffset = OrderedOffsets.FirstOrDefault(o => o.OffsetDateTime > cpTime);
double offset = cpOffset != null ? cpOffset.CPOffset : 0;
还有另一种更简洁的方法吗?在Select()
之后使用FirstorDefault()
无法编译但我觉得这可能适合吗?
答案 0 :(得分:42)
我认为这应该有用,我不在VS附近检查出来......
OrderedOffsets.Where(o => o.OffsetDateTime > cpTime).Select(x => x.CPOffset).FirstOrDefault();
答案 1 :(得分:10)
DefaultIfEmpty
可用于确保集合始终至少包含一个元素。
double offset = OrderedOffsets.Where(o => o.OffsetDateTime > cpTime)
.Select(o => o.CPOffset)
.DefaultIfEmpty()
.First();
答案 2 :(得分:4)
我认为一个好的模式可能是:
double offset = (OrderedOffsets.FirstOrDefault(o => o.OffsetDateTime > cpTime) ?? someDefaultObject).CPOffset;
someDefaultObject
保持默认值的对象...使用此模式,您可以通过代码轻松更改默认值!
如果OrderedOffsets可以是一个结构,你也可以将默认值放在那里! :)