2013-03-20 52 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