El comando “yield return” guarda el siguiente estado del iterador.
Mientras se convierte la lista en lotes, yield return salta el objeto que ha sido verificado en la condición if pero no ha sido agregado al cubo debido a las restricciones de tamaño.
Recuento total de mensajes: 4
Recuento del primer cubo: 2
Recuento del segundo cubo: 1
Se está omitiendo el tercer mensaje de la lista de mensajes.
Aquí estoy creando cubos de tamaño 250kb. ¿Hay alguna otra forma de guardar el estado correcto o debo utilizar un bucle for?
public static IEnumerable<>
{
List
long tamaño = 0;
foreach (var elemento in source)
{
if (cubo == null)
{
cubo = new List
}
tamaño = tamaño + elemento.Tamaño;
if (250 - (tamaño / 1024) >= elemento.Tamaño / 1024)
{
cubo.Add(elemento);
continue;
}
yield return cubo;
cubo = new List<mensaje>();
tamaño = 0;
}
if (cubo?.Count > 0 && tamaño<250)
{
yield return cubo;
}
}
davy.ai
Para guardar el estado correcto, puedes modificar el método
GetBatchSize
para incluir un parámetro adicional que haga un seguimiento del índice del último elemento agregado al cubo. Luego, en cada iteración, puedes verificar si el elemento actual ya ha sido agregado al cubo comparando su índice con el último índice. Si ha sido agregado, puedes omitirlo y pasar al siguiente elemento. Aquí tienes un ejemplo de cómo podrías modificar el método:Ten en cuenta que también debemos decrementar
i
al final del bucle interno cuando encontramos un elemento que no puede ser agregado al cubo, para que volvamos a procesar ese elemento en la próxima iteración con un cubo nuevo.Alternativamente, podrías usar un bucle
for
en lugar de un bucleforeach
, e incrementar y decrementar manualmente el contador del bucle según sea necesario, pero esto puede hacer que el código sea más difícil de leer y mantener.