2009-04-09 8 views
122

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

Considérese que estoy teniendo

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

Ahora si me dan el índice inicial y el índice final de la matriz a se debe conseguir copiado a otra matriz.

Me gusta si doy el índice de inicio como 1 y el índice final como 3, los elementos 2, 3, 4 deben copiarse en la nueva matriz.

Respuesta

219
int[] b = new int[3]; 
Array.Copy(a, 1, b, 0, 3); 
  • a = matriz de origen
  • 1 = iniciar índice en matriz de origen
  • b = destino array
  • 0 = iniciar índice en matriz de destino
  • 3 = elementos para copiar
+5

Con los parámetros con nombre que están disponibles ahora, no necesitaría documentar ninguno de los 5 parámetros. –

+11

@Hamish, bueno, 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 * logren eso. –

16

Ver this question. LINQ Take() y Skip() son las respuestas más populares, así como Array.CopyTo().

A supuestamente más rápido extension method is described here.

+0

Gracias. Exactamente lo que estaba buscando. – iamserious

+0

Otra pregunta sobre SO con una respuesta adecuada: http://stackoverflow.com/a/3539065/411428 – Manfred

+1

Tenga en cuenta que LINQ no es ideal cuando se trata de situaciones de rendimiento crítico –

1

Nota: me encontré con esta pregunta en busca de uno de los pasos en la respuesta a cómo cambiar el tamaño de una matriz existente.

Así que 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 cuestión de cambiar el tamaño de una matriz.

Para cualquier otra persona encontrar esta pregunta buscando el mismo que yo, es muy simple:

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

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

T[] arrayVariable; 

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

Ver the MSDN article para más.

2
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 la clase que tiene el método Copiar, que copia el elemento de una matriz a b matriz.

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

0

En caso si desea 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 de límite.

Cuestiones relacionadas