2015-04-13 3 views
0

мне нужно создать партию с ленивым перечислимы со следующими требованиями:Как построить партию/ведро с LINQ

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

Вопрос похож, но более ограничительным для следующих параметров:

ответ

0

Первоначально Написал @Nick_Whaley в Create batches in linq, но не лучший ответ в виде Stion был сформулирован иначе:

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

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()); 
} 

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

Смежные вопросы