我想使用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;
答案 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;