2011-10-10 20 views
7

Supponendo che ho il seguente ciclo:Come posso limitare un ciclo di foreach n?

foreach (DataRow dr in table.rows) 
{ 
    ... 
} 

Come si può impedire che l'esecuzione più spesso di n volte?

+2

Per un nuovo progra mmer, assicurati di guardare le risposte che fanno i contatori espliciti nei loop, anche se alla fine scegli uno degli approcci "Take (50)". –

+0

@AnthonyPegram: ottimo suggerimento per qualcuno che sta imparando. –

risposta

9

Si potrebbe provare

using System.Linq; 
... 
... 
... 
foreach (DataRow dr in rows.Cast<DataRow>().Take(50)) { } 

Si noti che si deve chiamare Cast<DataRow>() per convertire DataRowCollection-IEnumerable<DataRow>, che vi permetterà di utilizzare il metodo Take() estensione.

+0

Hai provato questo codice? Non esiste un metodo 'Take' direttamente disponibile per' DataRowCollection'. –

+0

@James - vedi modifica ;-) –

3

Opzione 1: Avere un contatore in esecuzione:

var i = 0; 
foreach (DataRow dr in rows) 
{ 
    i++; 
    if(i >= 50) break; 
} 

Opzione 2: Utilizzare un ciclo 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, modificare la query originale per restituire solo 50 righe. Non ha senso riprendere più di quello che vuoi usare.

Altri hanno fornito buone alternative se questa non è un'opzione.

18

In caso rows è in realtà proprio da DataTable.Rows, semplici Take risposte non funzionerà come DataRowCollection implementa solo l'interfaccia non generico IEnumerable, mentre LINQ richiede quello generico. Avrete bisogno di qualcosa di simile a:

// 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

Mi hai reso titubante nel correggere gli errori di battitura;) Il segno più alla fine del secondo esempio era intenzionale? –

+0

@JamesJohnson: No, solo un errore questa volta :) –

+0

Non dovrebbe essere questa la risposta accettata? – xpereta

1

Prova questo:

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

I .Cast<DataRow>().Take(50) Linq approcci vanno bene, ma questo è davvero un problema semplice per un ciclo for :

for(int i = 0; i < Math.Min(50, rows.Count); ++i) 
{ 
    var row = rows[i]; 
}