2009-04-09 29 views
122

Come posso copiare una parte di un array in un altro array?Come copiare parte di un array in un altro array in C#?

consideri che sto avendo

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

Ora, se io do l'indice di partenza e l'indice fine della matrice a dovrebbe ottenere copiati su un altro array.

Come se fornissi l'indice iniziale come 1 e l'indice finale come 3, gli elementi 2, 3, 4 dovrebbero essere copiati nel nuovo array.

risposta

219
int[] b = new int[3]; 
Array.Copy(a, 1, b, 0, 3); 
  • a = array source
  • 1 = iniziare indice nella matrice di origine
  • b = destinazione matrice
  • 0 = iniziare indice nella matrice di destinazione
  • 3 = elementi copiare
+5

Con i parametri denominati disponibili ora, non è necessario documentare nessuno dei 5 parametri. –

+11

@Hamish bene, forse. Personalmente non aggiungerei nomi espliciti a meno che non abbia reso il codice significativamente più chiaro, e non sono sicuro (in questo caso) che i nomi dei parametri * da soli * lo raggiungano. –

16

Vedere this question. Take() e Skip() LINQ sono le risposte più popolari, oltre a Array.CopyTo().

A presumibilmente più veloce extension method is described here.

+0

Grazie. esattamente quello che stavo cercando. – iamserious

+0

Un'altra domanda su SO con una risposta adeguata: http://stackoverflow.com/a/3539065/411428 – Manfred

+1

Si noti che LINQ non è l'ideale quando si affrontano situazioni critiche per le prestazioni –

1

Nota: Ho trovato questa domanda cerca di uno dei passaggi della risposta a come ridimensionare un array esistente.

Quindi ho pensato di aggiungere le informazioni qui, nel caso in cui qualcun altro stesse cercando come eseguire una copia a distanza come risposta parziale alla domanda di ridimensionamento di un array.

Per chiunque altro trovare questa domanda cercando la stessa cosa che mi ha, è molto semplice:

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

dove T è il tipo, cioè dove arrayVariable è dichiarato:

T[] arrayVariable; 

Questo metodo gestisce i controlli nulli, così come newSize == oldSize non ha alcun effetto e, ovviamente, gestisce silenziosamente il caso in cui uno degli array è più lungo dell'altro.

Vedere the MSDN article per ulteriori informazioni.

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); 

Dove Array è di classe con metodo Copy, che copia l'elemento di una matrice in array b.

Durante la copia da un array a un altro array, è necessario fornire lo stesso tipo di dati a un altro array di cui si sta copiando.

0

Nel caso in cui si desideri implementare il proprio metodo Array.Copy.

Metodo statico di tipo generico.

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]; 
    } 
    } 

Implementazione del metodo al contorno.

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(); 
      } 
     } 
Problemi correlati