.NET Самый быстрый способ перебирать строки в datatable? - PullRequest
0 голосов
/ 09 октября 2008

Что обычно быстрее при чтении / сравнении информации строки из таблицы данных?

'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

А если есть разница, при каких обстоятельствах стоит использовать один над другим?

Заранее спасибо за любые рекомендации!

Ответы [ 6 ]

7 голосов
/ 09 октября 2008

Компилятор расширяет цикл For Each на короткий цикл.

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

Таким образом, вы платите небольшую сумму накладных расходов. Но для ясности, я бы все равно использовал For Each, если вы работаете только с одной строкой и не изменяете набор данных.

3 голосов
/ 09 октября 2008

Второй будет иметь небольшой штраф. Однако, что касается обстоятельств, я бы всегда использовал метод 2 для ясности кода. Однако я бы использовал метод 1, если мне когда-нибудь понадобится что-то сделать, например, получить доступ к следующей / предыдущей строке при анализе текущей строки.

3 голосов
/ 09 октября 2008

На самом деле без разницы. Хотя технически вы платите небольшую цену в методе foreach за переход через интерфейс IEnumerable.

2 голосов
/ 09 октября 2008

Ну, есть разница, поскольку GetEnumerator и MoveNext, которые вызываются в цикле foreach, являются виртуальными (вызов требует прохождения через указатель) и, следовательно, не могут быть встроены. Эти накладные расходы в действительности невелики, если только вы не делаете лот циклов.

В некоторых случаях, хотя компилятор заменяет foreach на цикл for (я полагаю, при переборе массивов).

Лично я предпочитаю foreach в моем коде ASP.NET MVC для ясности, как многие здесь говорили, но часто также использую цикл for. Джо Даффи недавно опубликовал интересную статью о стоимости перечисления http://joeduffyblog.com/2008/09/21/the-cost-of-enumerating-in-net/

1 голос
/ 09 октября 2008

@ gdean232 прав - почти без разницы. Если производительность является проблемой, использование SqlDataReader вместо этого заметно быстрее.

0 голосов
/ 09 октября 2008

Реализация foreach на самом деле немного быстрее, чем стандартная реализация, потому что каждый доступ к массиву индекса должен проверяться границами. Тем не менее, так как идиома:

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

встречается часто, компилятор ищет его как особый случай и оптимизирует, чтобы он стал быстрее. Однако любое небольшое отклонение от этого формата (например, int len ​​= MyArray.Count; for (int i = 0; i

...