2010-05-27 3 views
2

Из списка builtAgents Мне нужны все элементы с OptimPriority == 1 и только 5 элементов с OptimPriority == 0. Я делаю это с двумя отдельными запросами, но мне интересно, могу ли я сделать это только с одним запросом.Могу ли я сделать эти два запроса 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

Concatenate как результат, используя Concat 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 сек спичек ...

0

Как @Sachin предлагает звуки Contat - лучший вариант. У вас есть два разных запроса значений, стратегия не то же самое.

Но, только наконечник, я действительно ценю лямбда-выражения:

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