2015-04-13 1 views
0

je dois créer des lots d'un paresseux dénombrable aux exigences suivantes:Comment construire des lots/seaux avec LINQ

  • Memory friendly: les articles doivent être paresseux chargés même dans chaque lot (IEnumerable<IEnumerable<T>>, exclut les tableaux de construction de la solution)
  • la solution ne doit pas énumérer deux fois l'entrée (exclut les solutions avec Skip() et Take())
  • la solution ne doit pas itérer l'entrée entière sinon nécessaire (exclure des solutions avec GroupBy)

La question est similaire, mais plus restrictive suivants:

Répondre

0

Posté par @Nick_Whaley dans Create batches in linq, mais pas le meilleure réponse que le que stion a été formulé différemment:

Essayez ceci:

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

L'astuce est de passer la recenseur ancienne mode entre l'énumération interne et externe, pour permettre la poursuite entre deux lots.