2014-05-12 65 views
0

有沒有更好的書寫方式? 我不喜歡空校驗是有在嘗試訪問對象之前檢查對象是否爲空

editItem.FrameVent =fd.FirstOrDefault(x => x.hardwaretype == 39 
&& x.name.StartsWith("Frame Vent"))==null?null: fd.FirstOrDefault(x => x.hardwaretype == 39 
&& x.name.StartsWith("Frame Vent")).hardwareid; 

我能做到不重複的查詢位

+0

由於這不是問題,可能是這應該在http://codereview.stackexchange.com/ –

+0

中提出我可能會分解爲兩個單獨的查詢清晰度 – theMayer

回答

6

重寫它的方式:

editItem.FrameVent = fd.Where(x => x.hardwaretype == 39 && x.name.StartsWith("Frame Vent")) 
         .Select(p => p.hardwareid) 
         .FirstOrDefault(); 
+0

10這引入了'O(n)'哪如果你去當地的變量,可以沒有這樣做。 –

+0

@SriramSakthivel原來的'O'是什麼? ;) –

+0

我同意原來是最糟糕的;) –

0

你也可以做多一點經典:

var result = fd.FirstOrDefault(x => x.hardwaretype == 39 && x.name.StartsWith("Frame Vent")); 
editItem.FrameVent = result == null ? null : result.hardwareid; 
0

您可以添加一個變量來簡化

var frameVent = fd.FirstOrDefault(x => x.hardwaretype == 39 && x.name.StartsWith("Frame Vent")); 
editItem.FrameVent = frameVent==null ? null : frameVent.hardwareid; 
0

正如一些額外的信息,而不是一個答案:

如果微軟不避開貫徹「安全導航操作」(「?」)(as requested here),那麼解決方案將看像這樣:

editItem.FrameVent = 
    fd.FirstOrDefault(x => x.hardwaretype == 39 && x.name.StartsWith("Frame Vent")) 
    ?.hardwareid; 

是否引入這個新操作符是一個好主意是一個爭論的問題。 :)