首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >LINQ - FirstOrDefault()然后选择()

LINQ - FirstOrDefault()然后选择()
EN

Stack Overflow用户
提问于 2013-03-21 07:37:30
回答 3查看 66.6K关注 0票数 37

我有下面的LINQ查询,当FirstOrDefault()返回null时会触发和异常。理想情况下,我希望避免null检查。有没有办法做到这一点?如果没有满足FirstOrDefault()调用的CPOffsets,我希望返回0

代码语言:javascript
复制
double offset = OrderedOffsets.FirstOrDefault(o => o.OffsetDateTime > cpTime).CPOffset;

我能看到的实现这一点的唯一方法是:

代码语言:javascript
复制
CPOffset cpOffset = OrderedOffsets.FirstOrDefault(o => o.OffsetDateTime > cpTime);
double offset = cpOffset != null ? cpOffset.CPOffset : 0;

有没有其他更简洁的方法?在FirstorDefault()之后使用Select()不能编译,但我认为在这里可能是合适的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-21 07:49:43

我想这应该行得通,我不在VS附近去检查它...

代码语言:javascript
复制
OrderedOffsets.Where(o => o.OffsetDateTime > cpTime).Select(x => x.CPOffset).FirstOrDefault();
票数 61
EN

Stack Overflow用户

发布于 2013-03-21 07:50:27

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

代码语言:javascript
复制
double offset = OrderedOffsets.Where(o => o.OffsetDateTime > cpTime)
    .Select(o => o.CPOffset)
    .DefaultIfEmpty()
    .First();
票数 12
EN

Stack Overflow用户

发布于 2013-03-21 08:38:30

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

代码语言:javascript
复制
double offset = (OrderedOffsets.FirstOrDefault(o => o.OffsetDateTime > cpTime) ?? someDefaultObject).CPOffset;

使用someDefaultObject作为保存默认值的对象...有了这个模式,你可以很容易地通过你的代码改变你的默认值!

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15536830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档