Как создавать пакеты/сегменты с помощью linq

Мне нужно создать партии из ленивого перечисления со следующими требованиями:

  • Удобство использования памяти: элементы должны лениво загружаться даже в каждом пакете (IEnumerable<IEnumerable<T>>, исключая массивы построения решений)
  • решение не должно дважды перечислять входные данные (исключая решения с Skip() и Take())
  • решение не должно перебирать весь ввод, если это не требуется (исключая решения с GroupBy)

Вопрос аналогичен, но более ограничителен для следующего:


person gremo    schedule 13.04.2015    source источник


Ответы (1)


Первоначально опубликовано @Nick_Whaley в разделе Создание пакетов в linq, но не лучший ответ, поскольку вопрос был сформулировано иначе:

Попробуй это:

public static IEnumerable<IEnumerable<T>> Bucketize<T>(this IEnumerable<T> items, int bucketSize)
{
    var enumerator = items.GetEnumerator();
    while (enumerator.MoveNext())
        yield return GetNextBucket(enumerator, bucketSize);
}

private static IEnumerable<T> GetNextBucket<T>(IEnumerator<T> enumerator, int maxItems)
{
    int count = 0;
    do
    {
        yield return enumerator.Current;

        count++;
        if (count == maxItems)
            yield break;

    } while (enumerator.MoveNext());
}

Хитрость заключается в том, чтобы передать старомодный счетчик между внутренним и внешним перечислением, чтобы обеспечить продолжение между двумя пакетами.

person jeromerg    schedule 13.04.2015