Comment copier une partie d'un tableau dans un autre tableau en C #?

144

Comment puis-je copier une partie d'un tableau dans un autre tableau?

Considérez que j'ai

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

Maintenant, si je donne l'index de début et l'index de fin du tableau, ail devrait être copié dans un autre tableau.

Comme si je donne l'index de début à 1 et l'index de fin à 3, les éléments 2, 3, 4 devraient être copiés dans le nouveau tableau.

SyncMaster
la source

Réponses:

273
int[] b = new int[3];
Array.Copy(a, 1, b, 0, 3);
  • a = tableau source
  • 1 = index de départ dans le tableau source
  • b = tableau de destination
  • 0 = index de départ dans le tableau de destination
  • 3 = éléments à copier
Marc Gravell
la source
7
Avec les paramètres nommés qui sont disponibles maintenant, vous n'auriez pas besoin de documenter l'un des 5 paramètres.
Hamish Grubijan
11
@Hamish bien, peut-être. Personnellement, je n'ajouterais pas de noms explicites à moins que cela ne rende le code beaucoup plus clair, et je ne suis pas sûr (dans ce cas) que les noms de paramètres par eux - mêmes y parviendraient.
Marc Gravell
19

Voir cette question . LINQ Take () et Skip () sont les réponses les plus populaires, ainsi que Array.CopyTo ().

Une méthode d'extension prétendument plus rapide est décrite ici .

Pontus Gagge
la source
1
Une autre question sur SO avec une réponse appropriée: stackoverflow.com/a/3539065/411428
Manfred
2
Notez que LINQ n'est pas idéal lorsqu'il s'agit de situations critiques pour les performances
XD me fait face
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);

Où Array est une classe ayant la méthode Copy, qui copie l'élément d'un tableau dans un tableau b.

Lors de la copie d'un tableau vers un autre tableau, vous devez fournir le même type de données à un autre tableau que vous copiez.

Bajran
la source
1

Remarque: j'ai trouvé cette question à la recherche de l'une des étapes de la réponse pour redimensionner un tableau existant.

J'ai donc pensé ajouter ces informations ici, au cas où quelqu'un d'autre chercherait comment faire une copie à distance comme réponse partielle à la question du redimensionnement d'un tableau.

Pour quiconque trouve cette question à la recherche de la même chose que moi, c'est très simple:

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

T est le type, c'est-à-dire où arrayVariable est déclaré:

T[] arrayVariable;

Cette méthode gère les vérifications nulles, ainsi que newSize == oldSize sans effet, et bien sûr gère silencieusement le cas où l'un des tableaux est plus long que l'autre.

Consultez l'article MSDN pour en savoir plus.

Appuriste - Paul W
la source
0

Si vous souhaitez implémenter votre propre méthode Array.Copy .

Méthode statique qui est de type générique.

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

Implémentation de la méthode aux limites.

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
la source