2011-10-10 7 views
7

次のループがあると仮定します。foreachループの実行を制限するにはどうすればよいですか?

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

どうやってn回以上実行されないようにしますか?

+2

新しいprogra最終的に 'Take(50)'のアプローチの1つに行っても、明示的なカウンタをループで実行する答えを確認してください。 –

+0

@AnthonyPegram:学習している人のための非常に良い提案。 –

答えて

9

あなたはTake()拡張メソッドを使用できるようになりますあなたがIEnumerable<DataRow>DataRowCollectionを変換するためにCast<DataRow>()を呼び出す必要があり

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

注意を試みることができます。

+0

このコードを試しましたか? 'DataRowCollection'に直接利用可能な' Take'メソッドはありません。 –

+0

@James - 編集を参照してください;-) –

3

オプション1:

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

オプション2:わずか50行を返すにあなたの元のクエリを変更する、理想的にはforループ

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

を使用して実行しているカウンターを持っています。あなたが使いたい以上にフェッチする必要はありません。

これがオプションでない場合、他に良い選択肢があります。場合rows

18

がちょうどDataTable.Rowsから実際には、与えられたシンプルなTake答えはLINQは一般的なものが必要なのに対してのみ、非ジェネリックIEnumerableインタフェースを実装DataRowCollectionとして機能しません。これを試してみてください

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

または

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

あなたは私に誤植を訂正することを躊躇させました;)意図的な2番目の例の最後にプラス記号がありましたか? –

+0

@JamesJohnson:いいえ、今回は入力ミスです:) –

+0

これは受け入れられた回答ではありませんか? – xpereta

1

:あなたのような何かをする必要があります

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

.Cast<DataRow>().Take(50) LINQのアプローチは罰金ですが、これは本当にforループのための簡単な問題であり、 :

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