2013-03-20 80 views
18

我有以下LINQ查询火灾和异常时FirstOrDefault()返回null。理想情况下,我想避免空检查。有没有办法做到这一点?如果没有满足FirstOrDefault()呼叫的CPOffsets,我希望返回0LINQ - 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; 

有另一种更简洁的方式?在FirstorDefault()未编译后使用Select(),但我认为在这里可能适用?

+1

这实际上是关于简明扼要,你会得到......大部分时间“足够好”是不够好:-) – theMayer 2013-03-20 23:47:26

+0

我同意。如果你想要它更简洁,你可能不得不推出你自己的方法或扩展方法。 (这并不一定是坏事)编辑:没有错'双偏置= DetermineOffset(OrderedOffsets,cpTime);'或'双偏置= OrderedOffsets.DetermineOffset(cpTime)'或'双偏置= OrderedOffsets.DetermineOffset(O = > o.OffsetDateTime> cpTime);'如果你想对谓词有更多的控制权。 – 2013-03-20 23:48:23

+0

检查了这一点:HTTP://stackoverflow.com/questions/14791514/streamlined-way-to-do-c-sharp-run-time-type-identification-that-avoids-a-null-ch/14791613#14791613 – 2013-03-20 23:53:41

回答

34

我认为这应该工作,我不是附近VS检查出来...

OrderedOffsets.Where(o => o.OffsetDateTime > cpTime).Select(x => x.CPOffset).FirstOrDefault(); 
+1

@Servy - 如果所有的OffsetDateTime都是 Simon 2013-03-20 23:56:42

+0

@Servy,假设'First'就够了。比使用'FirstOrDefault'好多少? 9个字符? – I4V 2013-03-21 00:05:11

+0

慢,我写了一个自己的解决方案,这是不是遍历整个集合(多数民众赞成他在哪里做)。 – 2013-10-27 19:08:23

9

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

double offset = OrderedOffsets.Where(o => o.OffsetDateTime > cpTime) 
    .Select(o => o.CPOffset) 
    .DefaultIfEmpty() 
    .First(); 
2

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

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

someDefaultObject的物体保持默认值...有了这种模式,你可以通过你的代码很容易地改变你的默认值!

如果OrderedOffsets可以是一个结构,你也可以只是把你的默认值有! :)

+1

好的,这可行,但是,为什么你认为这会比NSGaga的答案更好。它不需要一个临时obejct'someDefaultObject',更具可读性(当然主观) – 2013-03-21 00:45:34

+0

是的,但我真的不喜欢,我们把所有的值> cpTime后'Where'我更喜欢后恢复的方法找到它第一个元素,如果列表是巨型的,我们是否真的想要将所有的CPOffset投影到一个新的表单中?我认为这是不值得保存一条线......我宁愿在问题的最初两条线...... – Romain 2013-03-21 00:55:57

+1

我认为你应该阅读更多关于Linq和懒惰评估。 NSGaga的答案只要找到第一场比赛就会回来。如果它没有找到匹配,那么它将遍历所有列表,对于你的答案也是如此。 – 2013-03-21 01:29:19