¿Hay alguna manera de usar un bucle que tome los primeros 100 elementos en una lista grande, haga algo con ellos, luego los siguientes 100, etc., pero cuando se acerca al final, acorta automáticamente el paso "100" a los elementos restantes?
Actualmente tengo que usar dos bucles if:
for (int i = 0; i < listLength; i = i + 100) { if (i + 100 < listLength) { //Does its thing with a bigList.GetRange(i, 100) } else { //Does the same thing with bigList.GetRange(i, listLength - i) } }¿Hay una mejor manera de hacer esto? Si no, al menos haré que la "cosa" sea una función para que el código no tenga que copiarse dos veces.
No me gustó ninguna de las respuestas enumeradas, así que hice mi propia extensión:
public static class IEnumerableExtensions { public static IEnumerable<IEnumerable<T>> MakeGroupsOf<T>(this IEnumerable<T> source, int count) { var grouping = new List<T>(); foreach (var item in source) { grouping.Add(item); if(grouping.Count == count) { yield return grouping; grouping = new List<T>(); } } if (grouping.Count != 0) { yield return grouping; } } }Entonces puedes usarlo:
foreach(var group in allItems.MakeGroupsOf(100)) { // Do something }Puede mantener una variable explícita para el punto final:
for (int i = 0, j; i < listLength; i = j) { j = Math.min(listLength, i + 100); // do your thing with bigList.GetRange(i, j) }