使用Linq

时间:2015-07-03 13:26:29

标签: c# 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;
}

感谢。

编辑:使用Asad建议的解决方案,我将代码更改为

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

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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());

答案 2 :(得分:0)

这取决于你尝试做什么,但你可以尝试这样的事情:

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