从builtAgent的列表中我需要所有具有OptimPriority == 1的项目,并且只有5项具有OptimPriority == 0.我使用两个单独的查询执行此操作但我想知道是否可以仅使用一个查询来实现此目的。
IEnumerable<Agent> priorityAgents =
from pri in builtAgents where pri.OptimPriority == 1 select pri;
IEnumerable<Agent> otherAgents =
(from oth in builtAgents where oth.OptimPriority == 0 select oth).Take(5);
答案 0 :(得分:2)
使用Concat运算符连接两个结果。所以它基本上是单个查询
IEnumerable<Agent> priorityAgents =
(from pri in builtAgents where pri.OptimPriority == 1 select pri).Concat((from oth in builtAgents where oth.OptimPriority == 0 select oth).Take(5));
答案 1 :(得分:0)
如果您的基础数据结构具有索引,那么最好使用两个查询来完成它,因为它将使用索引来检索匹配的项目。如果你问的是如何使它成为一行,你总是可以使用Concat
将结果放在一起。
否则,如果您检查了每个项目,我认为仍然使用LINQ并且只进行一次传递的唯一方法是以下(未经测试且潜在危险):
int zeroesTaken = 0;
IEnumerable<Agent> agents = from a in builtAgents
where a.OptimPriority == 1
|| (a.OptimPriority == 0 && ++zeroesTaken <= 5)
select a;
相当丑陋和危险,因为您当然必须确保在查询实际运行之后不要在其他任何地方触摸zeroesTaken
。如果查询必须多次运行,我不确定它是否真的有效!
我觉得将整个事情封装在一个循环遍历builtAgents
和yield return
匹配项中的每个项目的方法中会更好...
答案 2 :(得分:0)
正如@Sachin所说,Contat听起来是更好的选择。您有两个不同的值查询,策略不一样。
但是,只是一个提示,我非常感谢Lambda表达式:
IEnumerable<Agent> union = BuiltAgents.Where(p => p.OptimPriority == 1).Concat(BuiltAgents.Where(q => q.OptimPriority == 1).Take(5));