2015-07-03 115 views
2

我想使用linq提取特定元素。如果這個元素不在給定的列表中,我想使用該列表中的任何其他元素。使用Linq選擇特定元素

有沒有更簡單的方法來實現這個?這裏是我目前的解決方案:

string content = String.Empty; 
Text t = texts.FirstOrDefault(x => x.Display == Display.Terminal); 
if (t != null) 
{ 
    content = t.Value; 
} 
else 
{ 
    t = texts.FirstOrDefault(); 
    if (t != null) 
     content = t.Value; 
} 

謝謝。

編輯:使用阿薩德建議的解決方案,我改變了代碼

string content = (texts.FirstOrDefault(x => x.Display == Display.Terminal) ?? texts.FirstOrDefault() ?? new Text()).Value; 

回答

3

你可以多寫一點:

var t = texts.FirstOrDefault(x => x.Display == Display.Terminal) ?? texts.FirstOrDefault(); 
if (t != null) content = t.Value; 

如果你使用的是最新的C#,你甚至可以使用空傳播經營者,使其只是一個單一的表達:

var content = (texts.FirstOrDefault(x => x.Display == Display.Terminal) ?? texts.FirstOrDefault())?.Value; 
+0

謝謝!我不知道''''操作符。所以我修改了我的問題的解決方案。 'string content =(texts.FirstOrDefault(x => x.Sink == DisplaySink.Terminal)?? texts.FirstOrDefault()?? new Text())。Value;' – user3399383

1

可以使用擴展方法自己做:

public static class Extensions 
{ 
    public static T FirstOrDefaultValue<T>(
         this IEnumerable<T> source, 
         Func<T, bool> func, T defaultValue) where T : class 
    { 
     return source.FirstOrDefault(x => func(x)) ?? defaultValue; 
    } 
} 

和使用它像這樣:

Text t = texts.FirstOrDefaultValue(x => x.Display == Display.Terminal, x.First()); 
0

這取決於你想要做什麼,但你可以嘗試這樣的:

Text t = texts.FirstOrDefault(x => x.Display == Display.Terminal) ?? texts.FirstOrDefault(); 
string content = t != null ? t.Value : String.Empty; 
+0

好吧,也許還需要再提一個提示。不保證文本列表不爲空。在這種情況下,這段代碼會產生一個空指針異常。我對嗎? – user3399383

+0

更新了我的答案 – Fabjan