C# - Copiando uma coleção para um array


 Você precisa copiar o conteúdo de uma coleção para um array.

Fazer isso é bem simples...

Use o método ICollection.CopyTo que é implementado por todas as classes de coleção ou use o método ToArray que é implementado pelas coleções ArrayList, Stack e Queue.

Vamos explicar...

O método ICollection.CopyTo e o método ToArray executam aproximadamente a mesma função: eles
executam uma cópia superficial dos elementos contidos em uma coleção para um array.

A principal diferença é que CopyTo copia os elementos da coleção para um array existente, enquanto que ToArray cria um novo array antes de copiar os elementos da coleção para ele.

O método CopyTo usa dois argumentos: um array e um índice.

O array é o alvo da operação de cópia e deve ser de um tipo apropriado para lidar com os elementos da coleção. Se os tipos não corresponderem, ou nenhuma conversão implícita for possível do tipo do elemento da coleção para o tipo do elemento da matriz, será lançada uma exceção System.InvalidCastException.

O índice é o elemento inicial da matriz onde os elementos da coleção serão copiados. Se o índice for igual ou maior que o comprimento do array, ou o número de elementos de coleção exceder a capacidade do array, uma exceção System.ArgumentException será lançada.

As classes ArrayList, Stack e Queue e suas versões genéricas também implementam o método ToArray que cria automaticamente uma matriz do tamanho correto para acomodar uma cópia de todos os elementos da coleção.

Se você chamar ToArray sem argumentos, ele retornará um array objeto [], independentemente do tipo de objetos contidos na coleção.

Por conveniência, o método ArrayList.ToArray tem uma sobrecarga para a qual você pode passar um objeto System.Type que especifica o tipo de matriz que o método ToArray deve criar. (Você ainda deve converter a matriz fortemente tipada retornada para o tipo correto.)

Agora o código...

1- Copiando o conteúdo de um List() usando CopyTo

        private static void ListCopyToArray()
        {
            //Cria a lista
            var lista = new List<int>() { 5, 6, 7, 8, 9, 10, 11, 12 };
            // cria um array com o tanho da lista
            int[] array = new int[lista.Count];
            // Copia a lista para o array
            lista.CopyTo(array);
            foreach (var item in array)
                Write($" {item} ");
        }

2- Copiando o conteúdo de um List() usando ToArray

        private static void ListToArray()
        {
            //cria  uma lista
            var lista = new List<int>() { 5, 6, 7, 8, 9, 10, 11, 12 };

            //copia a lista para o array
            int[] array2 = lista.ToArray();
            //percorre o array e exibe os itens
            foreach (int valor in array2)
            {
                Write($" {valor} ");
            }
        }

O resultado final é  o mesmo :

O método de extensão ToArray é um método genérico que aloca internamente uma matriz Buffer onde os elementos são copiados.

Agora veremos outro exemplo usando um ArrayList e os métodos CopyTo e ToArray:

using System;
using System.Collections;
using static System.Console;
namespace Exemplo2
{
    class Program
    {
        static void Main(string[] args)
        {
            // Cria um novo ArrayList e preenche
            ArrayList lista = new ArrayList(5);
            lista.Add("Macoratti");
            lista.Add("Gustavo");
            lista.Add("José");
            lista.Add("Sônia");
            lista.Add("Melissa");
            // Cria uma array de strings e copia o ArrayList
            string[] array1 = new string[lista.Count];
            lista.CopyTo(array1, 0);
            // Agora Use o método ToArray para criar 
            // um objeto array a partir do contèudo da coleção
            object[] array2 = lista.ToArray();
            // Use o método ArrayList.ToArray para criar um array 
            // de strings fortemente tipada a partir do conteúdo da coleção
            string[] array3 = (string[])lista.ToArray(typeof(String));
            // Exibe o contéudo dos arrays
            Console.WriteLine("Array 1:");
            foreach (string s in array1)
            {
                WriteLine("\t{0}", s);
            }
            WriteLine("Array 2:");
            foreach (string s in array2)
            {
                WriteLine("\t{0}", s);
            }
            WriteLine("Array 3:");
            foreach (string s in array3)
            {
                WriteLine("\t{0}", s);
            }
            ReadLine();
        }
    }
}

O resultado obtido é visto abaixo:

Pegue o código completo do projeto aqui: CShp_CollectionArray.zip

"Porque há um só Deus, e um só Mediador entre Deus e os homens, Jesus Cristo homem."
1 Timóteo 2:5


 
Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti