Если вы хотите избежать foreach, вот способ сделать это с расширением LINQ Aggregate.
Учитывая следующий класс:
public class SomeType
{
public int Id {get;set;}
public int Val {get;set;}
}
и сгенерировав следующие элементы:
var items = new List<SomeType>();
for(var i = 1; i <= 14; i++)
{
var val = 0;
if((3 <= i && i <= 6) || (11 <= i && i <= 12))
val = 1;
items.Add(new SomeType { Id = i, Val = val});
}
Вы можете получить список списков элементов со значением 1, например, так:
var grouped = items.Aggregate(new List<List<SomeType>>() { new List<SomeType>() },
(acc,elem) =>
{
if(elem.Val == 0 && acc.Last().Count != 0)
acc.Add(new List<SomeType>());
else if(elem.Val == 1)
acc.Last().Add(elem);
return acc;
}, acc => acc.Where(x => x.Count != 0));
int groupNum = 1;
foreach (var group in grouped)
{
Console.WriteLine($"Group {groupNum++}");
foreach (var item in group)
Console.WriteLine($"{item.Id} - {item.Val}");
}
/* output:
Group 1
3 - 1
4 - 1
5 - 1
6 - 1
Group 2
11 - 1
12 - 1
*/
Это предполагает, что можно добавлять записи со значением 1 перед 0значение произошло, и я не уверен, что это особенно удобочитаемо, чем использование foreach, и вам, вероятно, лучше реализовать метод расширения, который в любом случае будет использовать foreach.