Прочитать на английском

Поделиться через


Array.Copy Метод

Определение

Копирует диапазон элементов из одного массива Array в другой массив Array и при необходимости выполняет приведение типов и упаковку-преобразование.

Перегрузки

Copy(Array, Int64, Array, Int64, Int64)

Копирует диапазон элементов из массива Array, начиная с заданного индекса источника, и вставляет его в другой массив Array, начиная с заданного индекса назначения. Длина и индексы задаются как 64-разрядные целые числа.

Copy(Array, Int32, Array, Int32, Int32)

Копирует диапазон элементов из массива Array, начиная с заданного индекса источника, и вставляет его в другой массив Array, начиная с заданного индекса назначения. Длина и индексы задаются как 32-битовые целые числа.

Copy(Array, Array, Int32)

Копирует диапазон элементов из массива Array, начиная с первого элемента, и вставляет его в другой массив Array, также начиная с первого элемента. Длина задается как 32-битовое целое число.

Copy(Array, Array, Int64)

Копирует диапазон элементов из массива Array, начиная с первого элемента, и вставляет его в другой массив Array, также начиная с первого элемента. Длина задается как 64-битовое целое число.

Примеры

В следующем примере кода показано, как копировать данные из типа ArrayObject integer в другой Array .

using System;
public class SamplesArray  {

   public static void Main()  {

      // Creates and initializes a new Array of type int.
      Array myIntArray=Array.CreateInstance( typeof(System.Int32), 5 );
      for ( int i = myIntArray.GetLowerBound(0); i <= myIntArray.GetUpperBound(0); i++ )
         myIntArray.SetValue( i+1, i );

      // Creates and initializes a new Array of type Object.
      Array myObjArray = Array.CreateInstance( typeof(System.Object), 5 );
      for ( int i = myObjArray.GetLowerBound(0); i <= myObjArray.GetUpperBound(0); i++ )
         myObjArray.SetValue( i+26, i );

      // Displays the initial values of both arrays.
      Console.WriteLine( "int array:" );
      PrintValues( myIntArray );
      Console.WriteLine( "Object array:" );
      PrintValues( myObjArray );

      // Copies the first element from the int array to the Object array.
      Array.Copy( myIntArray, myIntArray.GetLowerBound(0), myObjArray, myObjArray.GetLowerBound(0), 1 );

      // Copies the last two elements from the Object array to the int array.
      Array.Copy( myObjArray, myObjArray.GetUpperBound(0) - 1, myIntArray, myIntArray.GetUpperBound(0) - 1, 2 );

      // Displays the values of the modified arrays.
      Console.WriteLine( "int array - Last two elements should now be the same as Object array:" );
      PrintValues( myIntArray );
      Console.WriteLine( "Object array - First element should now be the same as int array:" );
      PrintValues( myObjArray );
   }

   public static void PrintValues( Array myArr )  {
      System.Collections.IEnumerator myEnumerator = myArr.GetEnumerator();
      int i = 0;
      int cols = myArr.GetLength( myArr.Rank - 1 );
      while ( myEnumerator.MoveNext() )  {
         if ( i < cols )  {
            i++;
         } else  {
            Console.WriteLine();
            i = 1;
         }
         Console.Write( "\t{0}", myEnumerator.Current );
      }
      Console.WriteLine();
   }
}
/*
This code produces the following output.

int array:
    1    2    3    4    5
Object array:
    26    27    28    29    30
int array - Last two elements should now be the same as Object array:
    1    2    3    29    30
Object array - First element should now be the same as int array:
    1    27    28    29    30
*/

Copy(Array, Int64, Array, Int64, Int64)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Копирует диапазон элементов из массива Array, начиная с заданного индекса источника, и вставляет его в другой массив Array, начиная с заданного индекса назначения. Длина и индексы задаются как 64-разрядные целые числа.

public static void Copy (Array sourceArray, long sourceIndex, Array destinationArray, long destinationIndex, long length);

Параметры

sourceArray
Array

Массив Array, содержащий данные, которые требуется скопировать.

sourceIndex
Int64

64-разрядное целое число, представляющее индекс в массиве sourceArray, с которого начинается копирование.

destinationArray
Array

Массив Array, принимающий данные.

destinationIndex
Int64

64-разрядное целое число, представляющее индекс в массиве destinationArray, с которого начинается сохранение.

length
Int64

64-битовое целое число, представляющее число копируемых элементов. Целое число должно находиться в диапазоне от нуля до Int32.MaxValue включительно.

Исключения

sourceArray имеет значение null.

-или-

destinationArray имеет значение null.

sourceArray и destinationArray имеют различные ранги.

sourceArray и destinationArray имеют несовместимые типы.

По меньшей мере один элемент в sourceArray не может быть приведен к типу destinationArray.

sourceIndex находится вне диапазона допустимых индексов для sourceArray.

-или-

destinationIndex находится вне диапазона допустимых индексов для destinationArray.

-или-

length значение меньше 0 или больше int32.MaxValue.

length больше числа элементов с sourceIndex до конца sourceArray.

-или-

length больше числа элементов с destinationIndex до конца destinationArray.

Комментарии

Параметры sourceArray и destinationArray должны иметь одинаковое количество измерений. Кроме того, destinationArray уже должны быть измерены и иметь достаточное количество элементов, начиная с destinationIndex позиции, для размещения скопированных данных.

При копировании между многомерными массивами массив ведет себя как длинный одномерный массив, где строки (или столбцы) концептуально проложены сквозно. Например, если массив содержит три строки (или столбцы) с четырьмя элементами в каждом, копирование шести элементов из начала массива приведет к копированию всех четырех элементов первой строки (или столбца) и первых двух элементов второй строки (или столбца). Чтобы начать копирование со второго элемента третьей строки (или столбца), sourceIndex должна быть верхняя граница первой строки (или столбца) плюс длина второй строки (или столбца) плюс два.

Если sourceArray и destinationArray перекрываются, этот метод ведет себя так, как если бы исходные значения sourceArray были сохранены во временном расположении до destinationArray перезаписи.

[C++]

Этот метод эквивалентен стандартной функции memmoveC/C++, а не memcpy.

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

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

  • При копировании из массива Object ссылочного типа или типа значения в массив создается для хранения каждого значения или ссылки, Object а затем копируется. При копировании из массива Object в массив ссылочного типа или типа значения, а назначение невозможно, возникает исключение InvalidCastException .

  • Если sourceArray и destinationArray являются массивами ссылочного типа или оба массива типа Object, выполняется неглубокое копирование. Неглубокая копия Array является новой Array , содержащей ссылки на те же элементы, что и исходный Array. Сами элементы или элементы, на которые ссылаются эти элементы, не копируются. В отличие от этого, глубокая Array копия копирует элементы и все прямо или косвенно, на которые ссылаются элементы.

Если ArrayTypeMismatchException массивы имеют несовместимые типы, возникает исключение . Совместимость типов определяется следующим образом:

  • Тип совместим с самим собой.

  • Тип значения совместим с Object типом интерфейса, реализованным этим типом значения, и с ним. Тип значения считается подключенным к интерфейсу, только если он реализует этот интерфейс напрямую. Отключенные типы несовместимы.

  • Два встроенных (предопределенных) типа значений совместимы, если копирование из исходного типа в тип назначения является расширяющим преобразованием. Расширяющее преобразование никогда не теряет информацию, тогда как сужающее преобразование может потерять информацию. Например, преобразование 32-разрядного целого числа со знаком в 64-разрядное целое число со знаком является расширяющим преобразованием, а преобразование 64-разрядного целого числа со знаком в 32-разрядное целое число со знаком является сужающим преобразованием. Дополнительные сведения о преобразованиях см. в разделе Convert.

  • Неинтринсический (определяемый пользователем) тип значения совместим только с самим собой.

  • Перечисления имеют неявное преобразование в Enum и в их базовый тип.

Если для каждого элемента в требуется понижение (например, из базового класса в производный класс или из интерфейса в sourceArray объект) и один или несколько элементов не могут быть приведены к соответствующему типу в destinationArray, InvalidCastException создается исключение .

Если этот метод создает исключение при копировании, состояние destinationArray не определено.

Этот метод является операцией O(n), где n — .length

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Copy(Array, Int32, Array, Int32, Int32)

Исходный код:
Array.CoreCLR.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Копирует диапазон элементов из массива Array, начиная с заданного индекса источника, и вставляет его в другой массив Array, начиная с заданного индекса назначения. Длина и индексы задаются как 32-битовые целые числа.

public static void Copy (Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length);

Параметры

sourceArray
Array

Массив Array, содержащий данные, которые требуется скопировать.

sourceIndex
Int32

32-разрядное целое число, представляющее индекс в массиве sourceArray, с которого начинается копирование.

destinationArray
Array

Массив Array, принимающий данные.

destinationIndex
Int32

32-разрядное целое число, представляющее индекс в массиве destinationArray, с которого начинается сохранение.

length
Int32

32-битовое целое число, представляющее число копируемых элементов.

Исключения

sourceArray имеет значение null.

-или-

destinationArray имеет значение null.

sourceArray и destinationArray имеют различные ранги.

sourceArray и destinationArray имеют несовместимые типы.

По меньшей мере один элемент в sourceArray не может быть приведен к типу destinationArray.

sourceIndex меньше, чем нижняя граница первого измерения массива sourceArray.

-или-

destinationIndex меньше, чем нижняя граница первого измерения массива destinationArray.

-или-

Значение параметра length меньше нуля.

length больше числа элементов с sourceIndex до конца sourceArray.

-или-

length больше числа элементов с destinationIndex до конца destinationArray.

Комментарии

Параметры sourceArray и destinationArray должны иметь одинаковое количество измерений. Кроме того, destinationArray уже должны быть измерены и иметь достаточное количество элементов, начиная с destinationIndex позиции, для размещения скопированных данных.

При копировании между многомерными массивами массив ведет себя как длинный одномерный массив, где строки (или столбцы) концептуально проложены сквозно. Например, если массив содержит три строки (или столбцы) с четырьмя элементами в каждом, копирование шести элементов из начала массива приведет к копированию всех четырех элементов первой строки (или столбца) и первых двух элементов второй строки (или столбца). Чтобы начать копирование со второго элемента третьей строки (или столбца), sourceIndex должна быть верхняя граница первой строки (или столбца) плюс длина второй строки (или столбца) плюс два.

Если sourceArray и destinationArray перекрываются, этот метод ведет себя так, как если бы исходные значения sourceArray были сохранены во временном расположении до destinationArray перезаписи.

[C++]

Этот метод эквивалентен стандартной функции memmoveC/C++, а не memcpy.

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

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

  • При копировании из массива Object ссылочного типа или типа значения в массив создается для хранения каждого значения или ссылки, Object а затем копируется. При копировании из массива Object в массив ссылочного типа или типа значения, а назначение невозможно, возникает исключение InvalidCastException .

  • Если sourceArray и destinationArray являются массивами ссылочного типа или оба массива типа Object, выполняется неглубокое копирование. Неглубокая копия Array является новой Array , содержащей ссылки на те же элементы, что и исходный Array. Сами элементы или элементы, на которые ссылаются эти элементы, не копируются. В отличие от этого, глубокая Array копия копирует элементы и все прямо или косвенно, на которые ссылаются элементы.

Если ArrayTypeMismatchException массивы имеют несовместимые типы, возникает исключение . Совместимость типов определяется следующим образом:

  • Тип совместим с самим собой.

  • Тип значения совместим с Object типом интерфейса, реализованным этим типом значения, и с ним. Тип значения считается подключенным к интерфейсу, только если он реализует этот интерфейс напрямую. Отключенные типы несовместимы.

  • Два встроенных (предопределенных) типа значений совместимы, если копирование из исходного типа в тип назначения является расширяющим преобразованием. Расширяющее преобразование никогда не теряет информацию, тогда как сужающее преобразование может потерять информацию. Например, преобразование 32-разрядного целого числа со знаком в 64-разрядное целое число со знаком является расширяющим преобразованием, а преобразование 64-разрядного целого числа со знаком в 32-разрядное целое число со знаком является сужающим преобразованием. Дополнительные сведения о преобразованиях см. в разделе Convert.

  • Неинтринсический (определяемый пользователем) тип значения совместим только с самим собой.

  • Перечисления имеют неявное преобразование в Enum и в их базовый тип.

Если для каждого элемента в требуется понижение (например, из базового класса в производный класс или из интерфейса в sourceArray объект) и один или несколько элементов не могут быть приведены к соответствующему типу в destinationArray, InvalidCastException создается исключение .

Если этот метод создает исключение при копировании, состояние destinationArray не определено.

Этот метод является операцией O(n), где n — .length

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Copy(Array, Array, Int32)

Исходный код:
Array.CoreCLR.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Копирует диапазон элементов из массива Array, начиная с первого элемента, и вставляет его в другой массив Array, также начиная с первого элемента. Длина задается как 32-битовое целое число.

public static void Copy (Array sourceArray, Array destinationArray, int length);

Параметры

sourceArray
Array

Массив Array, содержащий данные, которые требуется скопировать.

destinationArray
Array

Массив Array, принимающий данные.

length
Int32

32-битовое целое число, представляющее число копируемых элементов.

Исключения

sourceArray имеет значение null.

-или-

destinationArray имеет значение null.

sourceArray и destinationArray имеют различные ранги.

sourceArray и destinationArray имеют несовместимые типы.

По меньшей мере один элемент в sourceArray не может быть приведен к типу destinationArray.

Значение параметра length меньше нуля.

length больше числа элементов в sourceArray.

-или-

length больше числа элементов в destinationArray.

Комментарии

Параметры sourceArray и destinationArray должны иметь одинаковое количество измерений. Кроме того, destinationArray уже должны быть измерены и иметь достаточное количество элементов для размещения скопированных данных.

При копировании между многомерными массивами массив ведет себя как длинный одномерный массив, где строки (или столбцы) концептуально проложены до конца. Например, если массив содержит три строки (или столбцы) с четырьмя элементами в каждом, копирование шести элементов из начала массива приведет к копированию всех четырех элементов первой строки (или столбца) и первых двух элементов второй строки (или столбца).

Если sourceArray и destinationArray перекрываются, этот метод ведет себя так, как если бы исходные значения sourceArray были сохранены во временном расположении до destinationArray перезаписи.

[C++]

Этот метод эквивалентен стандартной функции memmoveC/C++, а не memcpy.

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

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

  • При копировании из массива Object ссылочного типа или типа значения в массив создается для хранения каждого значения или ссылки, Object а затем копируется. При копировании из массива Object в массив ссылочного типа или типа значения, а назначение невозможно, возникает исключение InvalidCastException .

  • Если sourceArray и destinationArray являются массивами ссылочного типа или оба массива типа Object, выполняется неглубокое копирование. Неглубокая копия Array является новой Array , содержащей ссылки на те же элементы, что и исходный Array. Сами элементы или элементы, на которые ссылаются эти элементы, не копируются. В отличие от этого, глубокая Array копия копирует элементы и все прямо или косвенно, на которые ссылаются элементы.

Если ArrayTypeMismatchException массивы имеют несовместимые типы, возникает исключение . Совместимость типов определяется следующим образом:

  • Тип совместим с самим собой.

  • Тип значения совместим с Object типом интерфейса, реализованным этим типом значения, и с ним. Тип значения считается подключенным к интерфейсу, только если он реализует этот интерфейс напрямую. Отключенные типы несовместимы.

  • Два встроенных (предопределенных) типа значений совместимы, если копирование из исходного типа в тип назначения является расширяющим преобразованием. Расширяющее преобразование никогда не теряет информацию, тогда как сужающее преобразование может потерять информацию. Например, преобразование 32-разрядного целого числа со знаком в 64-разрядное целое число со знаком является расширяющим преобразованием, а преобразование 64-разрядного целого числа со знаком в 32-разрядное целое число со знаком является сужающим преобразованием. Дополнительные сведения о преобразованиях см. в разделе Convert.

  • Неинтринсический (определяемый пользователем) тип значения совместим только с самим собой.

  • Перечисления имеют неявное преобразование в Enum и в их базовый тип.

Если для каждого элемента в требуется понижение (например, из базового класса в производный класс или из интерфейса в sourceArray объект) и один или несколько элементов не могут быть приведены к соответствующему типу в destinationArray, InvalidCastException создается исключение .

Если этот метод создает исключение при копировании, состояние destinationArray не определено.

Этот метод является операцией O(n), где n — .length

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Copy(Array, Array, Int64)

Исходный код:
Array.cs
Исходный код:
Array.cs
Исходный код:
Array.cs

Копирует диапазон элементов из массива Array, начиная с первого элемента, и вставляет его в другой массив Array, также начиная с первого элемента. Длина задается как 64-битовое целое число.

public static void Copy (Array sourceArray, Array destinationArray, long length);

Параметры

sourceArray
Array

Массив Array, содержащий данные, которые требуется скопировать.

destinationArray
Array

Массив Array, принимающий данные.

length
Int64

64-битовое целое число, представляющее число копируемых элементов. Целое число должно находиться в диапазоне от нуля до Int32.MaxValue включительно.

Исключения

sourceArray имеет значение null.

-или-

destinationArray имеет значение null.

sourceArray и destinationArray имеют различные ранги.

sourceArray и destinationArray имеют несовместимые типы.

По меньшей мере один элемент в sourceArray не может быть приведен к типу destinationArray.

length значение меньше 0 или больше int32.MaxValue.

length больше числа элементов в sourceArray.

-или-

length больше числа элементов в destinationArray.

Комментарии

Параметры sourceArray и destinationArray должны иметь одинаковое количество измерений. Кроме того, destinationArray уже должны быть измерены и иметь достаточное количество элементов для размещения скопированных данных.

При копировании между многомерными массивами массив ведет себя как длинный одномерный массив, где строки (или столбцы) концептуально проложены до конца. Например, если массив содержит три строки (или столбцы) с четырьмя элементами в каждом, копирование шести элементов из начала массива приведет к копированию всех четырех элементов первой строки (или столбца) и первых двух элементов второй строки (или столбца).

Если sourceArray и destinationArray перекрываются, этот метод ведет себя так, как если бы исходные значения sourceArray были сохранены во временном расположении до destinationArray перезаписи.

[C++]

Этот метод эквивалентен стандартной функции memmoveC/C++, а не memcpy.

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

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

  • При копировании из массива Object ссылочного типа или типа значения в массив создается для хранения каждого значения или ссылки, Object а затем копируется. При копировании из массива Object в массив ссылочного типа или типа значения, а назначение невозможно, возникает исключение InvalidCastException .

  • Если sourceArray и destinationArray являются массивами ссылочного типа или оба массива типа Object, выполняется неглубокое копирование. Неглубокая копия Array является новой Array , содержащей ссылки на те же элементы, что и исходный Array. Сами элементы или элементы, на которые ссылаются эти элементы, не копируются. В отличие от этого, глубокая Array копия копирует элементы и все прямо или косвенно, на которые ссылаются элементы.

Если ArrayTypeMismatchException массивы имеют несовместимые типы, возникает исключение . Совместимость типов определяется следующим образом:

  • Тип совместим с самим собой.

  • Тип значения совместим с Object типом интерфейса, реализованным этим типом значения, и с ним. Тип значения считается подключенным к интерфейсу, только если он реализует этот интерфейс напрямую. Отключенные типы несовместимы.

  • Два встроенных (предопределенных) типа значений совместимы, если копирование из исходного типа в тип назначения является расширяющим преобразованием. Расширяющее преобразование никогда не теряет информацию, тогда как сужающее преобразование может потерять информацию. Например, преобразование 32-разрядного целого числа со знаком в 64-разрядное целое число со знаком является расширяющим преобразованием, а преобразование 64-разрядного целого числа со знаком в 32-разрядное целое число со знаком является сужающим преобразованием. Дополнительные сведения о преобразованиях см. в разделе Convert.

  • Неинтринсический (определяемый пользователем) тип значения совместим только с самим собой.

  • Перечисления имеют неявное преобразование в Enum и в их базовый тип.

Если для каждого элемента в требуется понижение (например, из базового класса в производный класс или из интерфейса в sourceArray объект) и один или несколько элементов не могут быть приведены к соответствующему типу в destinationArray, InvalidCastException создается исключение .

Если этот метод создает исключение при копировании, состояние destinationArray не определено.

Этот метод является операцией O(n), где n — .length

См. также раздел

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1