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?
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?
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.
Hai provato questo codice? Non esiste un metodo 'Take' direttamente disponibile per' DataRowCollection'. –
@James - vedi modifica ;-) –
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];
}
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.
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))
Mi hai reso titubante nel correggere gli errori di battitura;) Il segno più alla fine del secondo esempio era intenzionale? –
@JamesJohnson: No, solo un errore questa volta :) –
Non dovrebbe essere questa la risposta accettata? – xpereta
Prova questo:
foreach (DataRow dr in table.Rows.Cast<DataRow>().Take(50))
{
//your logic
}
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];
}
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)". –
@AnthonyPegram: ottimo suggerimento per qualcuno che sta imparando. –