Avançar para o conteúdo principal

C# IEnumerable e IEnumerator

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

Comentários

Mensagens populares deste blogue

Upgrade do Windows Home para Pro sem formatar

 Há algum tempo que tentava fazer o upgrade do meu Windows 10 da versão Home para a versão Pro, mas chegava sempre a um ponto em que me era solicitado para formatar o sistema e não estava para isso. Finalmente conseguinte seguindo estes passos: - seguinte estes passos  utilizei uma das chaves genéricas para o Windows 10 Pro e fui a Settings > Update & Security > Activation > Change the product key; - após inserir uma das chaves o Windows instala as funcionalidades Pro e pede para reiniciar; - agora tem o Windows Pro mas não está ativado, assim fui ao site urcdkeys  onde comprei uma chave para o Windows Pro por menos de €20; - com essa chave voltei a funcionalidade Change the product key e ativei o Windows; - e pronto, Windows Pro ativado sem formatar ou reinstalar. Importante : eu não tenho nada a ver com o site urcdkeys por isso a vossa experiência pode correr de forma diferente da minha.

Vamos fazer um carro com o Unity 3D

Neste artigo vamos fazer um carro, simples, com o Unity 3D. A ideia é utilizar o motor de física do Unity 3D para simular o comportamento do carro. Os passos a seguir são: [1] - Criar um projeto novo

Tem troco

Para hoje um pequeno programa que dá troco, bem dar não dá mas calcula o troco a dar em função das moedas disponíveis. Neste projeto vamos utilizar o novo Visual Studio 2012. Como era de se esperar vamos iniciar um projeto novo: Agora adicionamos os seguintes elementos:  - um botão para calcular as moedas a dar de troco  - um botão para repor o número de moedas iniciais disponíveis  - uma textbox para introduzir o valor a pagar  - uma textbox para introduzir o valor entregue  - umas labels para informar o utilizador do que deve introduzir e outra para mostrar o troco  - por fim uma grelha para mostrar os valores das moedas e as quantidades disponíveis de cada uma. A janela principal do programa fica assim: Agora o código, primeiro o evento load do formulário, neste vamos definir os valores das moedas e as respetivas quantidades Para guardar estes valores vamos necessitar de uma variável definida ao nível do formulário, logo abaixo da definição da class: Public Class Form1     Public mo