¿Cómo copiar parte de una matriz a otra matriz en C #?

144

¿Cómo puedo copiar una parte de una matriz a otra matriz?

Considera que estoy teniendo

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

Ahora, si doy el índice de inicio y el índice final de la matriz a, debería copiarse a otra matriz.

Al igual que si doy el índice de inicio como 1 y el índice final como 3, los elementos 2, 3, 4 deberían copiarse en la nueva matriz.

SyncMaster
fuente

Respuestas:

273
int[] b = new int[3];
Array.Copy(a, 1, b, 0, 3);
  • a = matriz fuente
  • 1 = índice de inicio en la matriz fuente
  • b = matriz de destino
  • 0 = índice de inicio en la matriz de destino
  • 3 = elementos para copiar
Marc Gravell
fuente
77
Con los parámetros con nombre que están disponibles ahora, no necesitaría documentar ninguno de los 5 parámetros.
Hamish Grubijan
11
@Hamish bien, tal vez. Personalmente, no agregaría nombres explícitos a menos que hiciera que el código fuera significativamente más claro, y no estoy seguro (en este caso) de que los nombres de los parámetros por sí mismos lo logren.
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);

Donde Array es una clase que tiene el método Copy, que copia el elemento de una matriz en una matriz b.

Al copiar de una matriz a otra matriz, debe proporcionar el mismo tipo de datos a otra matriz de la que está copiando.

bajran
fuente
1

Nota: Encontré esta pregunta buscando uno de los pasos en la respuesta sobre cómo cambiar el tamaño una matriz existente.

Entonces pensé que agregaría esa información aquí, en caso de que alguien más estuviera buscando cómo hacer una copia a distancia como una respuesta parcial a la pregunta de cambiar el tamaño de una matriz.

Para cualquier otra persona que encuentre esta pregunta buscando lo mismo que yo, es muy simple:

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

donde T es el tipo, es decir, donde se declara arrayVariable:

T[] arrayVariable;

Ese método maneja las comprobaciones nulas, así como newSize == oldSize que no tiene ningún efecto y, por supuesto, maneja en silencio el caso en que una de las matrices es más larga que la otra.

Vea el artículo de MSDN para más información.

Appurist - Paul W
fuente
0

En caso de que quiera implementar su propio método Array.Copy .

Método estático que es de 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]; 
     } 
  }

Implementación del método límite.

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
fuente