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, SyncRoote 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:

  1. No Visual C# .NET, crie um aplicativo Windows.

  2. 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.

  3. Adicione o seguinte código de exemplo ao início do módulo de classe para importar o System.Collection namespace:

    using System.Collections;
    
  4. 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.

  5. 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úblico CustomCollection :

    void ICollection.CopyTo(Array myArr, int index)
    {
        foreach (int i in intArr)
        {
            myArr.SetValue(i,index);
            index = index+1;
        }
    }
    
  6. Implemente o GetEnumerator método, que é herdado pela ICollection interface de IEnumerable. O GetEnumerator método retorna um Enumerator objeto que pode iterar por meio de uma coleção. Cole o seguinte código de exemplo após o CopyTo método:

    IEnumerator IEnumerable.GetEnumerator()
    {
        return new Enumerator(intArr);
    }
    
  7. 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 CustomCollectionde .

  1. 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 da CustomCollection classe quando o GetEnumerator método for chamado. O Cursor membro do campo mantém a posição atual durante a enumeração.

  2. Adicione um construtor com intArr como um parâmetro e defina o local intArr 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;
    }
    
  3. Implemente os Reset métodos e MoveNext . 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 o Cursor como -1 e MoveNext move o Cursor para o próximo elemento. MoveNext retorna True se for bem-sucedido.

  4. Implemente a Current propriedade somente leitura que retorna o item apontado pelo Cursor. Se o Cursor for -1, ele gerará um InvalidOperationException. Cole o seguinte código após o MoveNext 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

  1. Em Form1.cs, na guia Design , arraste um botão para o formulário.

  2. 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());
    
  3. 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.