.NET迭代数据表中的行的最快方法?

.NET迭代数据表中的行的最快方法?,.net,performance,ado.net,datatable,iteration,.net,Performance,Ado.net,Datatable,Iteration,从数据表中读取/比较行信息时,通常哪个最快 'assume dt as datatable' 'method 1' dim i as int32 for i = 0 to dt.rows.count - 1 .... next 'method 2' dim row as datarow for each row in dt.rows .... next 如果有区别,在什么情况下使用一个比另一个更划算 提前感谢您的指导 实际上没有区别。虽然从技术上讲,在foreach方法中要付

从数据表中读取/比较行信息时,通常哪个最快

'assume dt as datatable'

'method 1'
dim i as int32
for i = 0 to dt.rows.count - 1
   ....
next

'method 2'
dim row as datarow
for each row in dt.rows
    ....
next
如果有区别,在什么情况下使用一个比另一个更划算


提前感谢您的指导

实际上没有区别。虽然从技术上讲,在foreach方法中要付出很小的代价,但是对于通过IEnumerable接口,第二种方法会有轻微的惩罚。然而,在某些情况下,为了代码的清晰性,我个人总是使用方法2。但是,如果我需要在分析当前行时访问下一行/上一行,我会使用方法1。

@gdean232是正确的-几乎没有任何区别。如果性能有问题,使用SqlDataReader会更快。

编译器会将每个循环扩展为一个短while循环

for each row in dt.rows
// expands to:
IEnumerator e = dt.rows.GetEnumerator()
while e.MoveNext()
    row = e.Current

所以你要付少量的管理费。但为了澄清,如果您只处理一行,并且不修改数据集,我仍然会坚持使用每一行。

foreach实现实际上比标准实现略快,因为每个索引数组访问都需要进行边界检查。然而,由于这个成语:

for(int i =0; i < myArray.Count; ++i)
{
    // do something with myArray[i];
}
for(int i=0;i

如果是常见的,编译器会将其作为特例进行查找并进行优化,因此速度会更快。但是,与该格式的任何小偏差(例如int len=MyArray.Count;for(int i=0;i好吧,这是有区别的,因为在foreach循环中调用的GetEnumerator和MoveNext是虚拟的(调用需要通过指针),因此无法内联。实际上,这种开销很小,除非您执行大量循环

但在某些情况下,编译器将用for循环替换foreach(我相信在迭代数组时)

我个人更喜欢在ASP.NETMVC代码中使用foreach,这是为了清晰起见,正如许多人在这里所说的,但也经常使用for循环。 Joe Duffy最近发布了一篇关于枚举成本的有趣文章

是的,在我的测试工具中,这两种方法仅在大约100K次迭代后显示性能差异。