2015-07-03 114 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