var schedules = new List- {
new Item { Id=1, Name = \"S\" },
new Item { Id=2, Name = \"P\" },
new Item { Id=3, Name = \"X\" },
new Item { Id=4,
What you're looking for here is a GroupWhile
method.
Credit to user L.B for the solution. Go give his original answer an UpDoot https://stackoverflow.com/a/20469961/30155
var schedules = new List- {
new Item { Id=1, Name = "S" },
new Item { Id=2, Name = "P" },
new Item { Id=3, Name = "X" },
new Item { Id=4, Name = "X" },
new Item { Id=5, Name = "P" },
new Item { Id=6, Name = "P" },
new Item { Id=7, Name = "P" },
new Item { Id=8, Name = "S" }
};
var results = schedules
.GroupWhile((preceding, next) => preceding.Name == next.Name)
//Group items, while the next is equal to the preceding one
.Where(s => s.Count() > 1)
//Only include results where the generated sublist have more than 1 element.
.ToList();
foreach (var sublist in results)
{
foreach (Item i in sublist)
{
Console.WriteLine($"{i.Name} - {i.Id}");
}
Console.WriteLine("");
}
Console.ReadLine();
You can add the implementation as an Extension Method to all IEnumerable
like so.
public static class Extensions
{
public static IEnumerable> GroupWhile(this IEnumerable seq, Func condition)
{
T prev = seq.First();
List list = new List() { prev };
foreach (T item in seq.Skip(1))
{
if (condition(prev, item) == false)
{
yield return list;
list = new List();
}
list.Add(item);
prev = item;
}
yield return list;
}
}