Como copiar parte de uma matriz para outra matriz em c #?


144

Como copiar uma parte de uma matriz para outra matriz?

Considere que estou tendo

int[] a = {1,2,3,4,5};

Agora, se eu der o índice inicial e final da matriz, aele deve ser copiado para outra matriz.

Como se eu der o índice inicial como 1 e o índice final como 3, os elementos 2, 3, 4 devem ser copiados na nova matriz.

Respostas:


273
int[] b = new int[3];
Array.Copy(a, 1, b, 0, 3);
  • a = matriz de origem
  • 1 = índice inicial no array de origem
  • b = matriz de destino
  • 0 = índice inicial no array de destino
  • 3 = elementos para copiar

7
Com parâmetros nomeados que estão disponíveis agora, você não precisaria documentar nenhum dos 5 parâmetros.
Hamish Grubijan

11
@ Hamish bem, talvez. Pessoalmente, eu não adicionaria nomes explícitos, a menos que isso tornasse o código significativamente mais claro, e não tenho certeza (neste caso) de que os nomes dos parâmetros por si só conseguiriam isso.
Marc Gravell


3
int[] a = {1,2,3,4,5};

int [] b= new int[a.length]; //New Array and the size of a which is 4

Array.Copy(a,b,a.length);

Onde Array é uma classe com o método Copy, que copia o elemento de uma matriz para b.

Ao copiar de uma matriz para outra, é necessário fornecer o mesmo tipo de dados para outra matriz da qual você está copiando.


1

Nota: Encontrei esta pergunta procurando uma das etapas na resposta para como redimensionar uma matriz existente.

Por isso, pensei em adicionar essas informações aqui, caso mais alguém estivesse procurando como fazer uma cópia à distância como resposta parcial à questão de redimensionar uma matriz.

Para quem encontrar essa pergunta procurando a mesma coisa que eu, é muito simples:

Array.Resize<T>(ref arrayVariable, newSize);

onde T é o tipo, ou seja, onde arrayVariable é declarado:

T[] arrayVariable;

Esse método lida com verificações nulas, assim como newSize == oldSize sem efeito e, é claro, lida silenciosamente o caso em que uma das matrizes é mais longa que a outra.

Veja o artigo do MSDN para mais informações.


0

Caso você queira implementar seu próprio método Array.Copy .

Método estático, que é do tipo genérico.

 static void MyCopy<T>(T[] sourceArray, long sourceIndex, T[] destinationArray, long destinationIndex, long copyNoOfElements)
 {
  long totaltraversal = sourceIndex + copyNoOfElements;
  long sourceArrayLength = sourceArray.Length;

  //to check all array's length and its indices properties before copying
  CheckBoundaries(sourceArray, sourceIndex, destinationArray, copyNoOfElements, sourceArrayLength);
   for (long i = sourceIndex; i < totaltraversal; i++)
     {
      destinationArray[destinationIndex++] = sourceArray[i]; 
     } 
  }

Implementação do método de fronteira.

private static void CheckBoundaries<T>(T[] sourceArray, long sourceIndex, T[] destinationArray, long copyNoOfElements, long sourceArrayLength)
        {
            if (sourceIndex >= sourceArray.Length)
            {
                throw new IndexOutOfRangeException();
            }
            if (copyNoOfElements > sourceArrayLength)
            {
                throw new IndexOutOfRangeException();
            }
            if (destinationArray.Length < copyNoOfElements)
            {
                throw new IndexOutOfRangeException();
            }
        }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.