using System.Collections.Generic;
public static partial class EnumerableExtensions {
public static IEnumerable<T[]> GroupByAsc<T>(this IEnumerable<T> source,
Comparer<T> comparer = null) {
throw new ArgumentNullException(nameof(source));
if ((comparer ??= Comparer<T>.Default) is null)
throw new ArgumentNullException(nameof(comparer),
$"Type {typeof(T).Name} doesn't have default comparer");
List<T> list = new List<T>();
foreach (var item in source)
if (list.Count > 0 && comparer.Compare(list[list.Count - 1], item) <= 0)
yield return list.ToArray();
yield return list.ToArray();
private static void LinqDemo() {
int prior = int.MinValue;
Console.WriteLine("Pure Linq:");
Console.WriteLine(string.Join(Environment.NewLine, result.Select(g => string.Join(", ", g))));
private static void ForEachDemo() {
var result = arr.GroupByAsc();
Console.WriteLine("Extension method (foreach):");
Console.WriteLine(string.Join(Environment.NewLine, result.Select(g => string.Join(", ", g))));
public static void Main() {