[Delphi] 3 formas de percorrer uma lista

Saudações, leitores!
Nas versões mais antigas do Delphi (como a bem conhecida versão 7), sempre que era necessário percorrer uma lista, utilizávamos uma variável do tipo integer como contador, correto? No entanto, alguns programadores que migraram para as versões mais recentes do Delphi não conhecem algumas alternativas para essa codificação. As dicas desse artigo são simples, porém, podem despertar o interesse de programadores que ainda utilizam contadores. Vamos lá!

Introdução

Esse artigo é uma homenagem ao André Oliveira, que sempre orienta e recomenda melhores técnicas de programação através dos recursos que a linguagem fornece.

É bastante comum, em nossas codificações, percorrer listas para executar um processamento, como em itens de uma TListBox, campos de um DataSet ou componentes de um formulário. Neste artigo, optei por exemplificar uma lista de objetos com Generics. Considere a seguinte classe:

Nada de especial. A classe possui um campo private preenchido no constructor e manipulado através de uma propriedade. Como o exemplo é didático, suspendi a criação de Getters e Setters.

Na nossa aplicação, imagine que seja necessário trabalhar com uma lista de objetos do tipo TPessoa.

Com essa situação delimitada, apresentarei três formas de iterar essa lista pelos seguintes motivos:

  • Sair do paradigma de que só existe contadores;
  • Apresentar os recursos presentes nas versões mais recentes do Delphi;
  • Manter o código mais limpo e/ou expressivo.

1) Com contador

Bom, não preciso explicar muito, não é? :

A primeira forma consiste em utilizar uma variável numérica como contador da lista, acessando os itens pelo índice da iteração atual. Muitos programadores utilizam essa forma por ser, podemos dizer, “tradicional”.

Apenas a título de observação, notaram a presença do Pred? Essa função decrementa um número, substituindo, portanto, o Count - 1.

2) Com a estrutura for-in

Depois que publiquei o artigo sobre a cópia de registros de um DataSet, algumas pessoas ficaram surpresas com o for-in no Delphi, principalmente pelo fato de que essa estrutura não existe na versão 7. Pois bem, o for-in pode ser interpretado como “para cada X em Y, faça…”, semelhante ao foreach do C# e Java.

3) Com um Enumerator

Este é um recurso que poucos conhecem. Com Enumerators, não há contadores ou estruturas for-in. É necessário utilizar uma estrutura while, acessando o item da iteração atual pela propriedade Current:

O diferencial do Enumerator é a abstração ao trabalhar com a lista. A função GetEnumerator, por exemplo, responde a tipos genéricos, dispensando a necessidade de typecasts. Além disso, ao pressionar Ctrl + Espaço em Current, observe também que o Code Completion já exibe a propriedade como tipo TPessoa:

Property Current do Enumerator

No caso de uma TListBox ou similares que possuem uma lista de itens do tipo TStrings, a sintaxe é ligeiramente diferente por não se tratar de Generics. Neste caso, utilizamos o TStringsEnumerator:

Conhece outra forma de percorrer uma lista? Compartilhe conosco nos comentários!
Até breve, pessoal!


André Celestino