Как скопировать часть массива в другой массив в C #?

144

Как я могу скопировать часть массива в другой массив?

Считай, что у меня

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

Теперь, если я дам начальный и конечный индексы массива, aон должен быть скопирован в другой массив.

Например, если я задаю начальный индекс как 1 и конечный индекс как 3, элементы 2, 3, 4 должны быть скопированы в новый массив.

SyncMaster
источник

Ответы:

273
int[] b = new int[3];
Array.Copy(a, 1, b, 0, 3);
  • а = исходный массив
  • 1 = начальный индекс в исходном массиве
  • b = массив назначения
  • 0 = начальный индекс в массиве назначения
  • 3 = элементы для копирования
Марк Гравелл
источник
7
С именованными параметрами, которые доступны сейчас, вам не нужно документировать ни один из 5 параметров.
Хэмиш Грубиджан
11
@ Хорошо, возможно. Лично я не стал бы добавлять явные имена, если бы это не сделало код значительно более понятным, и я не уверен (в этом случае), что имена параметров сами по себе достигнут этого.
Марк Гравелл
19

Смотрите этот вопрос . LINQ Take () и Skip () являются наиболее популярными ответами, а также Array.CopyTo ().

Якобы более быстрый метод расширения описан здесь .

Pontus Gagge
источник
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.

При копировании из одного массива в другой массив вы должны указать тот же тип данных для другого массива, который вы копируете.

bajran
источник
1

Примечание: я нашел этот вопрос, ища один из шагов в ответе о том, как изменить размер существующего массива.

Поэтому я подумал, что добавлю эту информацию сюда, на случай, если кто-то еще будет искать способ сделать копию в дальнем углу в качестве частичного ответа на вопрос об изменении размера массива.

Для любого, кто найдет этот вопрос и ищет то же, что и я, это очень просто:

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

где T - это тип, т.е. где объявлено arrayVariable:

T[] arrayVariable;

Этот метод обрабатывает нулевые проверки, а также newSize == oldSize без эффекта и, конечно же, молча обрабатывает случай, когда один из массивов длиннее другого.

Смотрите статью MSDN для получения дополнительной информации.

Appurist - Пол W
источник
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();
            }
        }
Хамид Сайед
источник