// Copyright Epic Games, Inc. All Rights Reserved. using System; using System.Collections.Generic; namespace EpicGames.Core { /// /// Extension methods for /// public static class EnumerableExtensions { /// /// Split the sequence into batches of at most the given size /// /// The element type /// Sequence to split into batches /// Maximum size of each batch /// Sequence of batches public static IEnumerable> Batch(this IEnumerable sequence, int batchSize) { List elements = new List(batchSize); foreach (TElement element in sequence) { elements.Add(element); if (elements.Count == batchSize) { yield return elements; elements.Clear(); } } if (elements.Count > 0) { yield return elements; } } /// /// Finds the minimum element by a given field /// /// /// /// /// public static TElement MinBy(this IEnumerable sequence, Func selector) { IEnumerator enumerator = sequence.GetEnumerator(); if (!enumerator.MoveNext()) { throw new Exception("Collection is empty"); } TElement minElement = enumerator.Current; int minValue = selector(minElement); while (enumerator.MoveNext()) { int value = selector(enumerator.Current); if (value < minValue) { minElement = enumerator.Current; } } return minElement; } /// /// Finds the maximum element by a given field /// /// /// /// /// public static TElement MaxBy(this IEnumerable sequence, Func selector) { IEnumerator enumerator = sequence.GetEnumerator(); if (!enumerator.MoveNext()) { throw new Exception("Collection is empty"); } TElement maxElement = enumerator.Current; int maxValue = selector(maxElement); while (enumerator.MoveNext()) { int value = selector(enumerator.Current); if (value > maxValue) { maxElement = enumerator.Current; } } return maxElement; } } }