using System.Collections; namespace ErsatzTV.Core.Extensions; public static class IEnumerableExtensions { public static IEnumerable> GroupConsecutiveBy( this IEnumerable source, Func keySelector) { EqualityComparer comparer = EqualityComparer.Default; List currentGroup = null; foreach (TSource item in source) { TKey key = keySelector(item); if (currentGroup == null) { currentGroup = [item]; continue; } if (comparer.Equals(keySelector(currentGroup[0]), key)) { currentGroup.Add(item); } else { yield return new Grouping(keySelector(currentGroup[0]), currentGroup); currentGroup = [item]; } } if (currentGroup != null) { yield return new Grouping(keySelector(currentGroup[0]), currentGroup); } } private class Grouping(TKey key, IEnumerable elements) : IGrouping { public TKey Key { get; } = key; public IEnumerator GetEnumerator() => elements.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } }