Як скопіювати частину масиву в інший масив на C #?


144

Як я можу скопіювати частину масиву в інший масив?

Подумайте, у мене є

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

Тепер, якщо я даю початковий індекс та індекс кінця масиву, aвін повинен скопіюватися в інший масив.

Як якщо я даю початковий індекс як 1, а кінцевий індекс - 3, елементи 2, 3, 4 повинні бути скопійовані в новий масив.

Відповіді:


273
int[] b = new int[3];
Array.Copy(a, 1, b, 0, 3);
  • a = вихідний масив
  • 1 = індекс запуску у вихідному масиві
  • b = масив призначення
  • 0 = індекс запуску в масиві призначення
  • 3 = елементи для копіювання

7
З названими параметрами, які доступні зараз, вам не потрібно буде документувати жоден із 5 параметрів.
Гаміш Грубіян

11
@Hamish добре, можливо. Особисто я б не додавав явні імена, якщо б це не зробило код значно зрозумілішим, і я не впевнений (у цьому випадку), що імена параметрів самі по собі цього досягнуть.
Марк Гравелл

19

Дивіться це питання . LINQ Take () та Skip () - найпопулярніші відповіді, а також Array.CopyTo ().

Тут описаний нібито швидший метод розширення .


1
Ще одне запитання щодо SO з відповідною відповіддю: stackoverflow.com/a/3539065/411428
Манфред

2
Зауважте, що LINQ не ідеально підходить для вирішення критичних ситуацій
XD зіткнеться зі мною

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

Де Array - клас, що має метод Copy, який копіює елемент масиву в b масив.

Під час копіювання з одного масиву в інший масив ви повинні надати той же тип даних іншому масиву, який ви копіюєте.


1

Примітка. Я знайшов це питання шукаючи один із кроків у відповіді на те, як змінити розмір існуючого масиву.

Тому я думав, що я додам цю інформацію сюди, на випадок, якщо хтось інший шукатиме, як зробити діапазонну копію, як часткову відповідь на питання про зміну масиву.

Для всіх, хто знайшов це питання, шукаючи те саме, що і я, це дуже просто:

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

де T - тип, тобто де оголошено масивVariable:

T[] arrayVariable;

Цей метод обробляє нульові перевірки, а також newSize == oldSize без ефекту, і, звичайно, мовчки обробляє випадок, коли один з масивів довший за інший.

Докладнішу інформацію див. У статті MSDN .


0

У випадку, якщо ви хочете реалізувати власний метод Array.Copy .

Статичний метод родового типу.

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

Впровадження граничного методу.

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();
            }
        }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.