3 maneiras de copiar um vetor em C#

Thalita Sylvia Marques

você vai aprender

Maneira lógica de copiar um vetor

3 maneiras nem tão novas utilizando a classe Array do C#

Exemplos

pré-requisitos

Compreender bem vetores

Noção básica em funções (desejável)

Curiosidade (indispensável)

lógica

Utilizando seus conhecimentos em Lógica de Programação, como você implementaria um algoritmo em C# que copia os dados de um vetor para outro? Provavelmente faria algo assim:

1º→ Garante que o vetor a ser copiado está preenchido;
2º→ Cria um vetor do mesmo tamanho que o vetor a ser copiado;
3º→ Usa uma estrutura de repetição para iterar nos 2 vetores ao mesmo tempo, fazendo as cópias dos dados.

Exemplo:

namespace exemplo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] valores = { 2, 4, 6, 8, 10, 12, 14, 16 };
            int[] copiaValores = new int[valores.Length];

            for (int i = 0; i < valores.Length; i++)
            {
                copiaValores[i] = valores[i];
            }

            //imprime na tela os valores de copiaValores
            Console.Write("Valores copiados: ");
            for (int i = 0; i < copiaValores.Length; i++)
            {
                Console.Write(copiaValores[i] + " | ");
            }

            Console.ReadKey();
        }
    }
}


maneira lógica de copiar um vetor


Visto que copiar dados de um vetor para outro é um procedimento bastante comum na programação, a linguagem C# possui maneiras próprias de realizar este procedimento. Neste tutorial, veremos mais 3 maneiras de copiar vetores em C#: métodos CopyTo, Copy e Clone. Todos eles são da classe Array e têm suas próprias particularidades, embora também podem gerar na tela o mesmo resultado que o método lógico visto acima, se esse for o objetivo.

fragmento de código widget

maneira 1: Copy To

O método CopyTo é usado direto no vetor a ser copiado e o vetor que guardará as cópias deve ser previamente inicializado. Este metodo tem sobrecarga, mas funciona de apenas uma maneira. Veja a seguir, a descrição do método traduzida bem como a especificação de seus parâmetros:

sobrecarga CopyTo

Descrição:

"Copia todos os elementos do presente vetor unidimensional para o vetor unidimensional especificado começando do índice especificado do vetor de destino. O índice é especificado como um inteiro de 32bits/64bits" (depende da sobrecarga).

Parâmetros:

array: O vetor unidimensional que é destino dos elementos copiados do presente vetor. 
index: um número inteiro que representa o índice do array (destino) no qual o armazenamento começa. Este índice pode ser int ou long (sobrecarga).

Pra quem não sabe, long é um tipo primitivo de dados numéricos inteiros, assim como int. A diferença é que long tem capacidade de representar valores muito maiores do que os comportados por int.

Exemplo 1:

No exemplo a seguir as cópias começam a ser armazenadas no índice 0 (zero) do vetor destino, por este motivo, eles podem ser do mesmo tamanho sem que isso gere problemas.

namespace exemplo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] valores = { 2, 4, 6, 8, 10, 12, 14, 16 };
            int[] copiaValores = new int[valores.Length];

            valores.CopyTo(copiaValores, 0);

            //imprime na tela os valores de copiaValores
            Console.Write("Valores copiados: ");
            for (int i = 0; i < copiaValores.Length; i++)
            {
                Console.Write(copiaValores[i] + " | ");
            }

            Console.ReadKey();
        }
    }
}


as cópias começam a ser armazenadas no índice 0 (zero) do vetor destino

Exemplo 2:

Se o índice passado for um valor N (para N maior que zero), garanta que o vetor destino seja grande o suficiente para comportar todos so dados copiados, ou seja, tenha um tamanho de ao menos N elementos maior do que o vetor a ser copiado. As posições antes de N continuam com o valor default (no caso de dados inteiros, zero). Veja uma demonstração possível com N = 4:

namespace exemplo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] valores = { 2, 4, 6, 8, 10, 12, 14, 16 };
            int[] copiaValores = new int[valores.Length + 4];

            valores.CopyTo(copiaValores, 4);

            //imprime na tela os valores de copiaValores
            Console.Write("Valores copiados: ");
            for (int i = 0; i < copiaValores.Length; i++)
            {
                Console.Write(copiaValores[i] + " | ");
            }

            Console.ReadKey();
        }
    }
}


demonstração possível com N = 4

demonstração possível com N = 4 Imagem widget
sobrecarga CopyTo Imagem widget

maneira 2: Copy

Um outro método para copiar um vetor é o método Copy. Também sobrecarregado, este método possui 4 versões, podendo funcionar de 2 maneiras diferentes. No método Copy, o vetor destino também deve ser previamente inicializado.

sobrecarga método Copy

Descrição 1 ou 2 de 4:

"Copia uma coleção de elementos de um vetor começando no primeiro elemento e os insere no outro vetor começando no primeiro elemento. O comprimento é especificado como um número inteiro de 32bits/64bits" (depende da sobrecarga)

Parâmetros:

sourceArray: O vetor que contém os dados a copiar. 
destinationArray: O vetor que recebe os dados copiados. 
length: um dado inteiro que representa o número de elementos a copiar (pode ser int ou long)

Exemplo:

Note que o número de elementos a copiar (3º parâmetro) nada mais é que o tamanho do vetor. Pode ser passado tanto valores.Length quanto copiaValores.Length, pois ambos têm o mesmo tamanho.

namespace exemplo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] valores = { 2, 4, 6, 8, 10, 12, 14, 16 };
            int[] copiaValores = new int[valores.Length];

            Array.Copy(valores, copiaValores, valores.Length);

            //imprime na tela os valores de copiaValores
            Console.Write("Valores copiados: ");
            for (int i = 0; i < copiaValores.Length; i++)
            {
                Console.Write(copiaValores[i] + " | ");
            }

            Console.ReadKey();
        }
    }
}


sobrecarca método Copy

Descrição 3 ou 4 de 4:

"Copia uma coleção de elementos de um vetor começando no índice especificado do vetor original e insere as copias no outro vetor começando no índice especificado deste vetor destino. O comprimento e os índices são especificados com um número inteiro de 32bits/64bits" (depende da sobrecarga)

Parâmetros:

sourceArray: O vetor que contém os dados a copiar. 
sourceIndex: um número inteiro que representa o índice do "sourceArray" no qual a cópia começa 
destinationArray: o vetor que recebe os dados 
destinationIndex: um número inteiro que representa o índice no "destinationArray" no qual o armazenamento começa
length: valor inteiro de 32bits/64bits (sobrecarga) que representa o número de elementos a copiar

Esta versão do método nos permite escolher de qual posição do vetor original começaremos a cópia dos dados e em qual posição do vetor cópia começamos a armazená-los. Esse recurso deve ser usado com ainda mais cuidado, pois torna o programa mais propício a erros. Lembrando: Comprimentos e índices de vetores nunca são negativos.

Exemplo 1:

Neste exemplo, os dados começam a ser copiados no índice 2 do vetor valores e são armazenados logo no início do vetor copiaValores, índice 0 (zero). Como os vetores têm o mesmo tamanho, sobram duas posições no vetor destino que permanecem com o valor default 0 (zero). Note que os dois vetores do exemplo têm o mesmo tamanho.

namespace exemplo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] valores = { 2, 4, 6, 8, 10, 12, 14, 16 };
            int[] copiaValores = new int[valores.Length];

            Array.Copy(valores, 2, copiaValores, 0, 6);

            //imprime na tela os valores de copiaValores
            Console.Write("Valores copiados: ");
            for (int i = 0; i < copiaValores.Length; i++)
            {
                Console.Write(copiaValores[i] + " | ");
            }

            Console.ReadKey();
        }
    }
}


2 vetores de mesmo tamanho


Exemplo 2:

Já neste outro exemplo, apesar das cópias também começarem a ser feitas no índice 2 do vetor valores, elas só são armazenadas a partir do índice 1 do vetor copiaValores. Significa que o primeiro e o último elemento continuam com o valor default 0 (zero). Note que os dois vetores do exemplo têm o mesmo tamanho.

namespace exemplo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] valores = { 2, 4, 6, 8, 10, 12, 14, 16 };
            int[] copiaValores = new int[valores.Length];

            Array.Copy(valores, 2, copiaValores, 1, 6);

            //imprime na tela os valores de copiaValores
            Console.Write("Valores copiados: ");
            for (int i = 0; i < copiaValores.Length; i++)
            {
                Console.Write(copiaValores[i] + " | ");
            }

            Console.ReadKey();
        }
    }
}


2 vetores de mesmo tamanho

2 vetores de mesmo tamanho Imagem widget
fragmento de código widget
sobrecarga método Copy Imagem widget

maneira 3: Clone

O método Clone é um método para ser usado diretamente em um vetor e nos retorna um objeto, e não um vetor. Por este motivo, usamos (int[]) para fazer uma conversão (casting) do objeto em um vetor de tipo adequado à situação. Já que nosso vetor copiaValores, que vai receber o retorno, é do tipo int, convertemos o objeto em um vetor também tipo int. 
Clone é um método sem sobrecargasem parâmetros e o vetor destino não é previamente inicializado.


descrição Clone

Descrição:

"Cria uma cópia superficial do vetor" 
Algumas propriedades podem não estar mais disponíveis na cópia. Porém, é suficiente quando queremos apenas os dados.

Exemplo:

namespace exemplo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] valores = { 2, 4, 6, 8, 10, 12, 14, 16 };
            int[] copiaValores;

            copiaValores = (int[])valores.Clone();

            //imprime na tela os valores de copiaValores
            Console.Write("Valores copiados: ");
            for (int i = 0; i < copiaValores.Length; i++)
            {
                Console.Write(copiaValores[i] + " | ");
            }

            Console.ReadKey();
        }
    }
}


exemplo Clone


exemplo Clone Imagem widget
exemplo Clone Imagem widget
fragmento de código widget
exemplo Clone Imagem widget
descrição Clone Imagem widget

links úteis

Voltar