Правильный способ сделать это с помощью LINQ и избегать множественных перечислений над входом состоит в том, чтобы сделать группировку или аналогичную информацию о том, является ли каждый элемент четным или нечетным.
Простой способ использования перегрузки для Select
, что смешивается в индексе , связанном с ToLookup
, дает вам то, что вы хотите:
var oddsAndEvens = input
.ToList() // if necessary to get from IQueryable to IEnumerable
.Select((item, index) => new { isEven = index % 2 != 0, item })
.ToLookup(
i => i.isEven,
i => i.item);
Это приведет к Lookup
, которая имеет следующее преимущество :
Если ключ не найден в коллекции, возвращается пустая последовательность.
blockquote>Это означает, что после указанного выше запроса LINQ вы можете:
var evens = oddsAndEvens[true]; var odds = oddsAndEvens[false];