38

我有以下 LINQ 查询,当FirstOrDefault()返回 null 时会触发和异常。理想情况下,我想避免空检查。有没有办法做到这一点?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()

4

3 回答 3

64

我认为这应该可行,我不在 VS 附近进行检查...

OrderedOffsets.Where(o => o.OffsetDateTime > cpTime).Select(x => x.CPOffset).FirstOrDefault();
于 2013-03-20T23:49:43.360 回答
13

DefaultIfEmpty可用于确保集合始终具有至少一个元素。

double offset = OrderedOffsets.Where(o => o.OffsetDateTime > cpTime)
    .Select(o => o.CPOffset)
    .DefaultIfEmpty()
    .First();
于 2013-03-20T23:50:27.403 回答
5

我认为一个好的模式可能是:

double offset = (OrderedOffsets.FirstOrDefault(o => o.OffsetDateTime > cpTime) ?? someDefaultObject).CPOffset;

带有someDefaultObject一个保存默认值的对象...使用此模式,您可以通过代码轻松更改默认值!

如果 OrderedOffsets 可以是一个结构,你也可以把你的默认值放在那里!:)

于 2013-03-21T00:38:29.530 回答