EnumerableEx.cs 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. namespace Lua;
  2. static class EnumerableEx
  3. {
  4. public static IEnumerable<IEnumerable<T>> GroupConsecutiveBy<T, TKey>(this IEnumerable<T> source, Func<T, TKey> keySelector)
  5. {
  6. if (source == null)
  7. throw new ArgumentNullException(nameof(source));
  8. if (keySelector == null)
  9. throw new ArgumentNullException(nameof(keySelector));
  10. using var enumerator = source.GetEnumerator();
  11. if (!enumerator.MoveNext())
  12. {
  13. yield break;
  14. }
  15. List<T> group = [enumerator.Current];
  16. var previousKey = keySelector(enumerator.Current);
  17. while (enumerator.MoveNext())
  18. {
  19. var currentKey = keySelector(enumerator.Current);
  20. if (!EqualityComparer<TKey>.Default.Equals(previousKey, currentKey))
  21. {
  22. yield return group;
  23. group = [];
  24. }
  25. group.Add(enumerator.Current);
  26. previousKey = currentKey;
  27. }
  28. yield return group;
  29. }
  30. }