Neste artigo vamos aprender como utilizar a interface IEnumerator por forma a permitir utilizar um ciclo foreach num conjunto ou coleção de dados.
A maior parte das coleções (listas e outras) já implementam a interface, mas neste caso vamos personalizar a maneira como percorremos a lista.
Quando utilizamos código assim:
foreach(Class c in Collection)
{
...
}
O compilador converte este código em algo assim:
IEnumerator cc = Collection.GetEnumerator()
while(cc.MoveNext())
{
c=(Class)cc.Current;
...
}
Ao implementar a interface IEnumerable significa que a classe implementa uma versão da função GetEnumerator() que deve devolver uma classe que implemente a interface IEnumerator.
Vamos explorar um exemplo.
Começamos pela classe client
Esta classe permitirá guardar os dados dos clientes, existindo um campo para indicar se o cliente ainda está ativo ou não.
De seguida temos uma classe que define uma lista de clientes e que implementa a interface IEnumerable que devolve um objeto do tipo ListOfClientsEnum, que será utilizado no ciclo foreach.
Na classe ListOfClientsEnum definimos o modo como se fará a enumaração dos elementos da lista.
Uma vez que só pretendemos percorrer os clientes ativos vamos implementar a interface IEnumerator.
Definimos uma lista dos clientes e uma variável para guardar a posição do elemento atual.
O construtor da classe define uma referência para a lista de clientes e define a posição atual em -1, ou seja, antes do primeiro elemento.
A interface IEnumerator obrigado a implementar as funções MoveNext, Reset e a propriedade Current, que a seguir se apresentam.
A propriedade Current devolve o elemento atualmente selecionado de acordo com a propriedade position.
A função MoveNext, no nosso caso, avança para o próximo elemento, se não existir devolve false.
A função Reset, coloca a posição de novo em -1.
Na função main utilizamos a classe assim:
Repare que listOfClients é um objeto e no entanto é utilizado no ciclo foreach para percorrer os clientes utilizando a nossa classe ListOfClientEnum.
Url para o projecto completo
A maior parte das coleções (listas e outras) já implementam a interface, mas neste caso vamos personalizar a maneira como percorremos a lista.
Quando utilizamos código assim:
foreach(Class c in Collection)
{
...
}
O compilador converte este código em algo assim:
IEnumerator cc = Collection.GetEnumerator()
while(cc.MoveNext())
{
c=(Class)cc.Current;
...
}
Ao implementar a interface IEnumerable significa que a classe implementa uma versão da função GetEnumerator() que deve devolver uma classe que implemente a interface IEnumerator.
Vamos explorar um exemplo.
Começamos pela classe client
Esta classe permitirá guardar os dados dos clientes, existindo um campo para indicar se o cliente ainda está ativo ou não.
De seguida temos uma classe que define uma lista de clientes e que implementa a interface IEnumerable que devolve um objeto do tipo ListOfClientsEnum, que será utilizado no ciclo foreach.
Na classe ListOfClientsEnum definimos o modo como se fará a enumaração dos elementos da lista.
Uma vez que só pretendemos percorrer os clientes ativos vamos implementar a interface IEnumerator.
Definimos uma lista dos clientes e uma variável para guardar a posição do elemento atual.
O construtor da classe define uma referência para a lista de clientes e define a posição atual em -1, ou seja, antes do primeiro elemento.
A interface IEnumerator obrigado a implementar as funções MoveNext, Reset e a propriedade Current, que a seguir se apresentam.
A propriedade Current devolve o elemento atualmente selecionado de acordo com a propriedade position.
A função MoveNext, no nosso caso, avança para o próximo elemento, se não existir devolve false.
A função Reset, coloca a posição de novo em -1.
Na função main utilizamos a classe assim:
Repare que listOfClients é um objeto e no entanto é utilizado no ciclo foreach para percorrer os clientes utilizando a nossa classe ListOfClientEnum.
Url para o projecto completo
Comentários
Enviar um comentário