2013-06-20 28 views
4

目前..我的代碼看起來像這樣。替代在Lambda中使用三元運算符

 
PhoneNumber = x.PhoneNumbers.FirstOrDefault() != null ? x.PhoneNumbers.FirstOrDefault().PhoneNumber : string.Empty, 

PHONENUMBERS是ICollection<PhoneNumber>

這也是在.Select(),所以我真的不能創建一個變量爲它之外。

Resharper抱怨x.PhoneNumbers.FirstOrDefault()可能爲空,而且說實話,我並不是想賣掉兩次FirstOrDefault。

任何其他想法,我想可能有另一種Lambda方法,我可以做類似的事情。

+0

好了,有了該代碼最大的問題是,你遍歷序列的兩倍。如果它代表一個數據庫查詢(這似乎是這種情況),那非常糟糕。 – Servy

+0

我同意,絕對不是最好的主意,因爲它是我操縱數據庫的結果 – jaekie

+0

由於這是來自數據庫,所以最好簡單地使用存儲的過程並將結果映射到複雜類型。在爲報告/顯示目的而加入和彙總數據時,我已經完成了這項工作。 – jfrankcarr

回答

12
PhoneNumber = x.PhoneNumbers.Select(pn => pn.PhoneNumber).FirstOrDefault() ?? "", 
8

第一種選擇,像馬庫斯的:

PhoneNumber = x.PhoneNumbers.Select(x => x.PhoneNumber) 
          .FirstOrDefault() ?? ""; 

另一種選擇:

PhoneNumber = x.PhoneNumbers.Select(x => x.PhoneNumber) 
          .DefaultIfEmpty("") 
          .First(); 

或者,如果你發現自己做這個有很多,你可以寫你自己的方法將二者結合起來:

public static TElement ProjectedFirstOrDefault<TSource, TElement> 
    (this IEnumerable<TSource> source, 
    Func<TSource, TElement> selector, 
    TElement defaultValue) where TElement : class 
{ 
    var firstElement = source.FirstOrDefault(); 
    return firstElement == null ? defaultValue : selector(firstElement); 
} 

Then:

PhoneNumber = x.PhoneNumbers.ProjectedFirstOrDefault(x => x.PhoneNumber, ""); 
+1

@Servy:嗯,這是要麼提供替代品或只是刪除我的答案。 (事實上​​,我確實刪除了我的答案,直到我想到替代方案。) –

0
var result = new List<Product>(); 

result = result.Where(o => o.Name == (string.IsNullOrEmpty(_nameParameter) ? o.Name : _nameParameter)).ToList();