LINQ - FirstOrDefault()然后选择()

时间:2013-03-20 23:37:30

标签: c# linq

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()无法编译但我觉得这可能适合吗?

3 个答案:

答案 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可以是一个结构,你也可以将默认值放在那里! :)