У меня есть список элементов, которые я хотел бы разделить на подмножества. Ради обсуждения допустим, что это файлы. Я хотел бы, чтобы каждое подмножество содержало не более 5 файлов, и чтобы общий размер файлов в подмножестве был менее 1 МБ, если это возможно. Если один файл превышает 1 МБ, он должен быть в подмножестве сам по себе.
Я записал это в несколько более обобщенной форме, используя общий размер элемента вместо размера файла. Но я подозреваю, что есть более простой и / или лучший способ сделать это. Какие-либо предложения?
Вот что у меня есть:
public static IEnumerable<IEnumerable<T>> InSetsOf<T>(this IEnumerable<T> source, int maxItemsPerSet, int maxMetricPerSet, Func<T, int> getMetric)
{
int currentMetricSum = 0;
List<T> currentSet = new List<T>();
foreach (T listItem in source)
{
int itemMetric = getMetric(listItem);
if (currentSet.Count > 0 &&
(currentSet.Count >= maxItemsPerSet || (currentMetricSum + itemMetric) > maxMetricPerSet))
{
yield return currentSet;
//Start a new subset
currentSet = new List<T>();
currentMetricSum = 0;
}
currentSet.Add(listItem);
currentMetricSum += itemMetric;
}
//Return the last set
yield return currentSet;
}