C# 从列表中的两个不同对象返回LINQ select查询中的特定对象

C# 从列表中的两个不同对象返回LINQ select查询中的特定对象,c#,.net,linq,C#,.net,Linq,我有一个列表,其中可能包含以下对象 ObjectFirst { id = 1; mode = Constants.Active; } ObjectSecond { id = 2; mode = Constants.Passive; } 如何进行LINQ查询以选择具有“mode=Constants.Active”的对象(如果存在),如果没有,则选择具有“mode=Constants.Passive”的对象?只应返回一个对象。我想用一个LINQ查询来解决这个问题。我不确定这是否可以在一个查询中完

我有一个列表,其中可能包含以下对象

ObjectFirst {
id = 1;
mode = Constants.Active;
}

ObjectSecond {
id = 2;
mode = Constants.Passive;
}

如何进行LINQ查询以选择具有“mode=Constants.Active”的对象(如果存在),如果没有,则选择具有“mode=Constants.Passive”的对象?只应返回一个对象。我想用一个LINQ查询来解决这个问题。

我不确定这是否可以在一个查询中完成,但可以通过多种方式完成,您可以尝试:

var obj = list.Any(r=> r.mode == Constants.Active) ? 
                            list.FirstOrDefault(r=> r.mode == Constants.Active)
                            list.FirstOrDefault(r=> r.mode == Constants.Passive);
或:


理论上,您可以通过
模式
对它们进行排序,从而赋予它们优先级,然后返回第一个。假设
常量.Active
低于
常量.Passive

var obj = list.OrderBy(r => r.mode).FirstOrDefault()
或者,您可以添加一些额外的检查:

var obj = list.Where(r => r.Id == someId).OrderBy(r => r.mode).FirstOrDefault()

@Hanski,我不确定是否可以这样做,而且即使可以用一个查询来完成,它真的可读吗?谢谢,第一行就是我要找的:)@Hanski,第一行虽然看起来是一个语句,但它有多个linq查询。这是一个很好的破解,适用于这种情况,但是如果值不同,则可能会失败,并且不会真正传达代码的真正意图。@Habib您能进一步解释一下,如果值不同,为什么会失败吗?可以选择使用自定义比较器。您还可以按bools排序:
var obj=list.OrderByDescending(r=>r.mode==Constants.Active)。FirstOrDefault()
@Richard,正如我所说,它在当前场景中非常有效,但是混合逻辑来检查元素是否存在,然后根据
OrderBy
获取它似乎不正确。
var obj = list.Where(r => r.Id == someId).OrderBy(r => r.mode).FirstOrDefault()