2011-10-10 50 views
7

假设我有以下循环:如何限制一个foreach循环运行?

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

如何保持它比n次运行更多的时候?

+2

For a new progra mmer,请务必查看循环中显式计数器的答案,即使您最终选择了“Take(50)”方法之一。 –

+0

@AnthonyPegram:对于正在学习的人有很好的建议。 –

回答

9

你可以尝试

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

请注意,你必须调用Cast<DataRow>()DataRowCollection转换为IEnumerable<DataRow>,这将允许您使用Take()扩展方法。

+0

你有没有试过这段代码? DataRowCollection没有直接可用的'Take'方法。 –

+0

@詹姆斯 - 见编辑;-) –

3

选项1:有一个正在运行计数器:

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

选项2:使用一个for循环

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

理想的情况下,修改原始查询只返回50行。获取超过您想要使用的内容毫无意义。

如果这不是一个选项,其他人已经提供了很好的选择。

18

如果rows实际上是刚刚从DataTable.Rows,给予不作为DataRowCollection工作简单Take答案只有实现了非通用IEnumerable接口,而LINQ需要通用之一。你会需要这样的东西:

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

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

你让我犹豫纠正错别字;)是第二个故意故意结尾的加号? –

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