Usar o Visual C# para implementar coleções personalizadas
Este artigo passo a passo mostra como implementar uma coleção personalizada no Visual C#. As bibliotecas de classe base do Microsoft .NET Framework oferecem uma definição formal de uma interface de coleçãoSystem.Collections.ICollection
.
Versão original do produto: Visual C#
Número de KB original: 307484
Implementar a interface ICollection em uma classe personalizada
A ICollection
interface herda da IEnumerable
interface. A ICollection
interface define um CopyTo
método e três propriedades somente leitura: IsSynchronized
, SyncRoot
e Count
. ICollection
herda o GetEnumerator
método da IEnumerable
interface. Uma classe de coleção personalizada deve implementar a ICollection
interface.
Para implementar a ICollection
interface, siga estas etapas:
No Visual C# .NET, crie um aplicativo Windows.
Em Gerenciador de Soluções, clique com o botão direito do mouse no nome do projeto, aponte para Adicionar e clique em Adicionar Classe para adicionar um módulo de classe chamado CustomCollection.
Adicione o seguinte código de exemplo ao início do módulo de classe para importar o
System.Collection
namespace:using System.Collections;
Substitua qualquer outro código no módulo pelo seguinte código de exemplo:
public class CustomCollection : ICollection { private int[] intArr = {1,5,9}; private int Ct; public CustomCollection() { Ct=3; } }
Para simplificar, a
CustomCollection
classe contém uma matriz com três itens inteiros e uma variável de contagem.Implemente o
CopyTo
método, que usa uma matriz inteiro e um índice como parâmetros. Esse método copia os itens em uma coleção para a matriz a partir do índice que é passado. Para implementar esse método, cole o seguinte código após o construtor públicoCustomCollection
:void ICollection.CopyTo(Array myArr, int index) { foreach (int i in intArr) { myArr.SetValue(i,index); index = index+1; } }
Implemente o
GetEnumerator
método, que é herdado pelaICollection
interface deIEnumerable
. OGetEnumerator
método retorna umEnumerator
objeto que pode iterar por meio de uma coleção. Cole o seguinte código de exemplo após oCopyTo
método:IEnumerator IEnumerable.GetEnumerator() { return new Enumerator(intArr); }
Para implementar as três propriedades somente leitura, cole o seguinte código após o
GetEnumerator
método:// The IsSynchronized Boolean property returns True if the // collection is designed to be thread safe; otherwise, it returns False. bool ICollection.IsSynchronized { get { return false; } } // The SyncRoot property returns an object, which is used for synchronizing // the collection. This returns the instance of the object or returns the // SyncRoot of other collections if the collection contains other collections. object ICollection.SyncRoot { get { return this; } } // The Count read-only property returns the number // of items in the collection. int ICollection.Count { get { return Ct; } }
Implementar um objeto Enumerador para o método GetEnumerator
Esta seção mostra como criar uma Enumerator
classe que pode iterar por meio CustomCollection
de .
Cole o seguinte código de exemplo após a instrução de classe final no módulo de classe:
public class Enumerator : IEnumerator { private int[] intArr; private int Cursor; }
Declare a
intArr
matriz inteiro privada para manter os elementos daCustomCollection
classe quando oGetEnumerator
método for chamado. OCursor
membro do campo mantém a posição atual durante a enumeração.Adicione um construtor com
intArr
como um parâmetro e defina o localintArr
como este. Cole o seguinte código de exemplo após a declaração do campo membro:public Enumerator(int[] intarr) { this.intArr = intarr; Cursor = -1; }
Implemente os
Reset
métodos eMoveNext
. Para fazer isso, cole o seguinte código após o construtor:void IEnumerator.Reset() { Cursor = -1; } bool IEnumerator.MoveNext() { if (Cursor < intArr.Length) Cursor++; return(!(Cursor == intArr.Length)); }
Reset
define oCursor
como -1 eMoveNext
move oCursor
para o próximo elemento.MoveNext
retorna True se for bem-sucedido.Implemente a
Current
propriedade somente leitura que retorna o item apontado peloCursor
. Se oCursor
for -1, ele gerará umInvalidOperationException
. Cole o seguinte código após oMoveNext
método:object IEnumerator.Current { get { if((Cursor < 0) || (Cursor == intArr.Length)) throw new InvalidOperationException(); return intArr[Cursor]; } }
Usar para cada um iterar por meio da coleção personalizada
Em Form1.cs, na guia Design , arraste um botão para o formulário.
Clique duas vezes no botão e adicione o seguinte código de exemplo ao
Click
evento do botão:CustomCollection MyCol = new CustomCollection(); foreach (object MyObj in MyCol) MessageBox.Show(MyObj.ToString());
Pressione F5 para executar o aplicativo e clique no botão.
Observação
Uma caixa de mensagem exibe os itens na coleção personalizada.
Como isso funciona? Para cada um chama o GetEnumerator
método para criar o Enumerator
objeto e chama o MoveNext
método para definir o Cursor
como o primeiro item. Em seguida, a propriedade atual é acessada para obter o item em MyObj
. Isso é repetido até MoveNext
retornar False.
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários