2011-10-10 10 views
7

Zakładając mam następujące pętli:Jak ograniczyć pętlę foreach n działa?

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

Jak mogę zapobiec jego działa częściej niż n razy?

+2

Dla nowych programów Mian, spójrz na odpowiedzi, które czynią jawne liczniki w pętlach, nawet jeśli ostatecznie wybierzesz jedną z metod podejścia "Podejmij (50)". –

+0

@AnthonyPegram: Bardzo dobra sugestia dla kogoś, kto się uczy. –

Odpowiedz

9

można spróbować

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

Zauważ, że musisz zadzwonić Cast<DataRow>() w celu przekształcenia DataRowCollection do IEnumerable<DataRow>, który pozwoli Ci korzystać z metody Take() przedłużacza.

+0

Czy próbowałeś tego kodu? Nie ma metody "Take" dostępnej bezpośrednio dla 'DataRowCollection'. –

+0

@James - patrz edycja ;-) –

3

Wariant 1: Czy licznik pracuje:

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

Opcja 2: Użyj do pętli

for(int i = 0; i <= 50; i++) { 
    // This might actually crash if there are fewer than 50 rows 
    var row = rows[i]; 
} 
3

Idealnie, modyfikować swój pierwotny zapytanie do powrotu tylko 50 wierszy. Nie ma sensu przynosić więcej, niż chcesz wykorzystać.

Inne dostarczyły dobre alternatywy, jeśli nie jest to możliwe.

18

W przypadku rows jest właściwie tylko od DataTable.Rows, proste Take odpowiedzi udzielone nie będzie działać jako DataRowCollection realizuje tylko nierodzajową IEnumerable interfejs, podczas gdy LINQ potrzebuje rodzajowe jeden. Musisz coś takiego:

// Uses DataTableExtensions.AsEnumerable 
foreach (DataRow dr in table.AsEnumerable().Take(50)) 

lub

// Uses Enumerable.Cast 
foreach (DataRow dr in rows.Cast<DataRow>().Take(50)) 
+0

Zmusiłeś mnie do korekty literówek;) Czy znak plusa na końcu drugiego przykładu był celowy? –

+0

@JamesJohnson: Nie, tylko literówka tym razem :) –

+0

Czy nie powinna to być akceptowana odpowiedź? – xpereta

1

Spróbuj tego:

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

W .Cast<DataRow>().Take(50) Linq podejścia są w porządku, ale jest to naprawdę proste problemu dla for pętli :

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