Jak skopiować część tablicy do innej tablicy w C #?

144

Jak mogę skopiować część tablicy do innej tablicy?

Rozważ, że mam

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

Teraz, jeśli podam indeks początkowy i końcowy tablicy a, powinien on zostać skopiowany do innej tablicy.

Na przykład jeśli podam indeks początkowy jako 1, a indeks końcowy jako 3, elementy 2, 3, 4 powinny zostać skopiowane w nowej tablicy.

Sync Master
źródło

Odpowiedzi:

273
int[] b = new int[3];
Array.Copy(a, 1, b, 0, 3);
  • a = tablica źródłowa
  • 1 = początek indeksu w tablicy źródłowej
  • b = tablica docelowa
  • 0 = indeks początkowy w tablicy docelowej
  • 3 = elementy do skopiowania
Marc Gravell
źródło
7
Dzięki nazwanym parametrom, które są teraz dostępne, nie ma potrzeby dokumentowania żadnego z 5 parametrów.
Hamish Grubijan
11
@ Może dobrze. Osobiście nie dodałbym jawnych nazw, chyba że uczyniłoby to kod znacznie bardziej przejrzystym i nie jestem pewien (w tym przypadku), czy same nazwy parametrów to osiągną.
Marc Gravell
19

Zobacz to pytanie . Najpopularniejsze odpowiedzi to LINQ Take () i Skip (), a także Array.CopyTo ().

W tym miejscu opisano rzekomo szybszą metodę rozszerzania .

Pontus Gagge
źródło
1
Kolejne pytanie dotyczące SO z odpowiednią odpowiedzią: stackoverflow.com/a/3539065/411428
Manfred
2
Zauważ, że LINQ nie jest idealny w sytuacjach krytycznych dla wydajności
XD zmierzy się ze mną
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);

Gdzie Array jest klasą mającą metodę Copy, która kopiuje element tablicy do tablicy b.

Podczas kopiowania z jednej tablicy do drugiej, musisz podać ten sam typ danych do innej tablicy, której kopiujesz.

bajran
źródło
1

Uwaga: znalazłem to pytanie, szukając jednego z kroków w odpowiedzi na temat zmiany rozmiaru istniejącej tablicy.

Pomyślałem więc, że dodam te informacje tutaj, na wypadek, gdyby ktoś inny szukał sposobu wykonania kopii z zakresu jako częściowej odpowiedzi na pytanie o zmianę rozmiaru tablicy.

Dla każdego, kto znajdzie to pytanie i szuka tego samego, co ja, jest to bardzo proste:

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

gdzie T jest typem, tj. gdzie zadeklarowano zmienną tablicową:

T[] arrayVariable;

Ta metoda obsługuje sprawdzanie wartości null, a także newSize == oldSize nie wywołujące żadnego efektu i oczywiście po cichu obsługuje przypadek, w którym jedna z tablic jest dłuższa od drugiej.

Więcej informacji można znaleźć w artykule MSDN .

Appurist - Paul W.
źródło
0

W przypadku, gdy chcesz zaimplementować własny Array.Copy metodę .

Metoda statyczna o typie ogólnym.

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

Implementacja metody brzegowej.

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
źródło