Come copiare parte di un array su un altro array in C #?


144

Come posso copiare una parte di un array su un altro array?

Considera che sto avendo

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

Ora, se do l'indice iniziale e l'indice finale dell'array, aquesto dovrebbe essere copiato in un altro array.

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

Risposte:


273
int[] b = new int[3];
Array.Copy(a, 1, b, 0, 3);
  • a = matrice di origine
  • 1 = indice iniziale nella matrice di origine
  • b = array di destinazione
  • 0 = indice iniziale nell'array di destinazione
  • 3 = elementi da copiare

7
Con i parametri con nome che sono disponibili ora, non è necessario documentare nessuno dei 5 parametri.
Hamish Grubijan,

11
@Hamish bene, forse. Personalmente non aggiungerei nomi espliciti se non rendesse il codice significativamente più chiaro, e non sono sicuro (in questo caso) che i nomi dei parametri da soli lo raggiungerebbero.
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);

Dove Array è una classe con metodo Copia, che copia l'elemento di un array in un 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.


1

Nota: ho trovato questa domanda cercando uno dei passaggi nella risposta a come ridimensionare un array esistente.

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

Per chiunque abbia trovato questa domanda cercando la stessa cosa che ero, è molto semplice:

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

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

T[] arrayVariable;

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

Vedi l'articolo MSDN per ulteriori informazioni.


0

Nel caso in cui desideri implementare il tuo Array.Copy metodo .

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 limite.

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();
            }
        }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.