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.

Mestre da sincronização
fonte

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
Marc Gravell
fonte
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
19

Veja esta pergunta . LINQ Take () e Skip () são as respostas mais populares, assim como Array.CopyTo ().

Um método de extensão supostamente mais rápido é descrito aqui .

Pontus Gagge
fonte
1
Outra pergunta sobre SO com uma resposta adequada: stackoverflow.com/a/3539065/411428
Manfred
2
Observe que o LINQ não é ideal quando se lida com situações críticas de desempenho
XD me enfrentou
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.

Bajran
fonte
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.

Appurist - Paul W
fonte
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();
            }
        }
Hameed Syed
fonte