Suponiendo que tengo el siguiente bucle:¿Cómo puedo limitar que se ejecute un bucle foreach n?
foreach (DataRow dr in table.rows)
{
...
}
¿Cómo que no se ejecute con más frecuencia que n veces?
Suponiendo que tengo el siguiente bucle:¿Cómo puedo limitar que se ejecute un bucle foreach n?
foreach (DataRow dr in table.rows)
{
...
}
¿Cómo que no se ejecute con más frecuencia que n veces?
Usted podría intentar
using System.Linq;
...
...
...
foreach (DataRow dr in rows.Cast<DataRow>().Take(50)) { }
Tenga en cuenta que usted tiene que llamar Cast<DataRow>()
el fin de convertir a DataRowCollection
IEnumerable<DataRow>
, lo que le permitirá utilizar el método Take()
extensión.
¿Has probado este código? No hay ningún método 'Take' directamente disponible para' DataRowCollection'. –
@James - ver edición ;-) –
Opción 1: Tener un contador de ejecución:
var i = 0;
foreach (DataRow dr in rows)
{
i++;
if(i >= 50) break;
}
Opción 2: Utilice un bucle for
for(int i = 0; i <= 50; i++) {
// This might actually crash if there are fewer than 50 rows
var row = rows[i];
}
Idealmente, modificar su búsqueda original para devolver sólo 50 filas. No tiene sentido obtener más de lo que quiere usar.
Otros han proporcionado buenas alternativas si esta no es una opción.
En caso rows
es en realidad sólo de DataTable.Rows
, las simples Take
respuestas dadas no va a funcionar como DataRowCollection
solamente implementa la interfaz genérica no IEnumerable
, mientras que LINQ necesita el genérico. Usted necesitará algo como:
// Uses DataTableExtensions.AsEnumerable
foreach (DataRow dr in table.AsEnumerable().Take(50))
o
// Uses Enumerable.Cast
foreach (DataRow dr in rows.Cast<DataRow>().Take(50))
Me has hecho vacilar para corregir errores tipográficos;) ¿El signo más al final del segundo ejemplo fue intencional? –
@JamesJohnson: No, solo un error tipográfico esta vez :) –
¿No debería ser esta la respuesta aceptada? – xpereta
Prueba esto:
foreach (DataRow dr in table.Rows.Cast<DataRow>().Take(50))
{
//your logic
}
Los enfoques .Cast<DataRow>().Take(50)
Linq están muy bien, pero esto es realmente un problema sencillo para un bucle for
:
for(int i = 0; i < Math.Min(50, rows.Count); ++i)
{
var row = rows[i];
}
Para un nuevo programa Mmer, asegúrese de mirar las respuestas que hacen los contadores explícitos en bucles, incluso si finalmente opta por uno de los enfoques 'Take (50)'. –
@AnthonyPegram: Muy buena sugerencia para alguien que está aprendiendo. –