2011-10-10 51 views
7

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?

+2

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)'. –

+0

@AnthonyPegram: Muy buena sugerencia para alguien que está aprendiendo. –

Respuesta

9

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 DataRowCollectionIEnumerable<DataRow>, lo que le permitirá utilizar el método Take() extensión.

+0

¿Has probado este código? No hay ningún método 'Take' directamente disponible para' DataRowCollection'. –

+0

@James - ver edición ;-) –

3

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]; 
} 
3

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.

18

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)) 
+0

Me has hecho vacilar para corregir errores tipográficos;) ¿El signo más al final del segundo ejemplo fue intencional? –

+0

@JamesJohnson: No, solo un error tipográfico esta vez :) –

+0

¿No debería ser esta la respuesta aceptada? – xpereta

1

Prueba esto:

foreach (DataRow dr in table.Rows.Cast<DataRow>().Take(50)) 
{ 
    //your logic 
} 
0

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]; 
} 
Cuestiones relacionadas