2010-05-27 155 views
2

從BuiltAgents列表中,我需要OptimPriority == 1的所有項目,並且只有OptimPriority == 0的項目有5個。我用兩個單獨的查詢來完成此任務,但是我不知道是否可以僅使用一個查詢來完成此任務。我可以只將這兩個LINQ查詢合併爲一個查詢嗎?

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); 

回答

2

串連兩個結果使用的毗連operator.So它基本上單個查詢

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)); 
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 S中的匹配循環的方法封裝整個事情...

0

由於@Sachin建議Contat的聲音是更好的選擇。你有兩個不同的值查詢,策略是不一樣的。

但是,只是一個提示,我真的很感激Lambda表達式:

IEnumerable<Agent> union = BuiltAgents.Where(p => p.OptimPriority == 1).Concat(BuiltAgents.Where(q => q.OptimPriority == 1).Take(5)); 
相關問題