假设我有以下循环:
foreach (DataRow dr in table.rows)
{
...
}
如何让它比n次运行更频繁?
答案 0 :(得分:18)
如果rows
实际上仅来自DataTable.Rows
,则提供的简单Take
答案将无效,因为DataRowCollection
仅实现非通用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))
答案 1 :(得分:9)
你可以尝试
using System.Linq;
...
...
...
foreach (DataRow dr in rows.Cast<DataRow>().Take(50)) { }
请注意,您必须致电Cast<DataRow>()
才能将DataRowCollection
转换为IEnumerable<DataRow>
,这样您就可以使用Take()
扩展程序。
答案 2 :(得分:3)
选项1:有一个正在运行的计数器:
var i = 0;
foreach (DataRow dr in rows)
{
i++;
if(i >= 50) break;
}
选项2:使用for-loop
for(int i = 0; i <= 50; i++) {
// This might actually crash if there are fewer than 50 rows
var row = rows[i];
}
答案 3 :(得分:3)
理想情况下,将原始查询修改为仅返回50行。获取超过您想要使用的内容毫无意义。
如果不是一种选择,其他人提供了很好的选择。
答案 4 :(得分:1)
试试这个:
foreach (DataRow dr in table.Rows.Cast<DataRow>().Take(50))
{
//your logic
}
答案 5 :(得分:0)
.Cast<DataRow>().Take(50)
Linq方法很好,但这对于for
循环来说确实是一个简单的问题:
for( int i = 0; i < Math.Min(50, rows.Count); ++i )
{
var row = rows[i];
}