Pergunta

O que é geralmente mais rápida ao ler / comparar informações linha de uma DataTable?

'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

E se há uma diferença, em que circunstâncias é que pagar para usar um sobre o outro?

Agradecemos antecipadamente por qualquer orientação!

Foi útil?

Solução

Os expande compilador para cada um para um tempo curto circuito.

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

Então, você paga uma pequena quantidade de sobrecarga. Mas para clarities bem, eu ainda ia ficar com para cada um se você está trabalhando apenas em uma linha, e você não está modificando o conjunto de dados.

Outras dicas

Na realidade nenhuma diferença. Embora tecnicamente pagar um preço pequeno no método foreach, para atravessar a interface IEnumerable.

O segundo teria uma pena leve. No entanto, como para as circunstâncias, eu persoanlly sempre usar o método 2 para maior clareza de código. No entanto, gostaria de usar o método 1 se eu precisar fazer algo, como acessar a próxima / anterior linha ao analisar a linha atual.

Bem, há uma diferença, uma vez GetEnumerator e MoveNext que são chamados em foreach loop são virtuais (chamando requer passando por um ponteiro) e, portanto, não pode ser embutido. Esta sobrecarga na realidade é pequena, a menos que você faça um muito de loops.

Em alguns casos, embora o compilador irá substituir foreach com um para-loop (eu acredito que quando a iteração sobre matrizes).

Eu pessoalmente prefiro foreach no meu código ASP.NET MVC para maior clareza, como muitos já disseram aqui, mas muitas vezes usam a muito for-loop. Joe Duffy postou recentemente um artigo interessante sobre o custo de enumerar http://joeduffyblog.com/2008/09 / 21 / o do custo de enumerar-in-net /

@ gdean232 é certo - quase nenhuma diferença em tudo. Se o desempenho for um problema, usando um um SqlDataReader vez é perceptível mais rápido.

A implementação foreach é na verdade um pouco mais rápido do que o padrão para a implementação, porque cada acesso à matriz índice precisa ser limites marcada. No entanto, desde o idioma:

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

é comum, os olhares do compilador para ele como um caso especial e otimiza-lo, por isso se torna mais rápido. No entanto, qualquer pequeno desvio em relação ao formato (tal como int len ??= MyArray.Count; para (int i = 0; i

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top