Перейти к содержимому

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

  • автор:

Array. Copy Метод

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

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

Перегрузки

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

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

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

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

Примеры

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

using namespace System; void PrintValues( Array^ myArr ); void main() < // Creates and initializes a new Array instance of type Int32. Array^ myIntArray = Array::CreateInstance( Type::GetType( "System.Int32" ), 5 ); for ( int i = myIntArray->GetLowerBound( 0 ); i GetUpperBound( 0 ); i++ ) myIntArray->SetValue( i + 1, i ); // Creates and initializes a new Array instance of type Object. Array^ myObjArray = Array::CreateInstance( Type::GetType( "System.Object" ), 5 ); for ( int i = myObjArray->GetLowerBound( 0 ); i GetUpperBound( 0 ); i++ ) myObjArray->SetValue( i + 26, i ); // Displays the initial values of both arrays. Console::WriteLine( "Int32 array:" ); PrintValues( myIntArray ); Console::WriteLine( "Object array:" ); PrintValues( myObjArray ); // Copies the first element from the Int32 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 Int32 array. Array::Copy( myObjArray, myObjArray->GetUpperBound( 0 ) - 1, myIntArray, myIntArray->GetUpperBound( 0 ) - 1, 2 ); // Displays the values of the modified arrays. Console::WriteLine( "Int32 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 Int32 array:" ); PrintValues( myObjArray ); > 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", myEnumerator->Current ); > Console::WriteLine(); > /* This code produces the following output. Int32 array: 1 2 3 4 5 Object array: 26 27 28 29 30 Int32 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 Int32 array: 1 27 28 29 30 */ 
open System let printValues (myArr: 'a []) = let mutable i = 0; let cols = myArr.GetLength(myArr.Rank - 1) for item in myArr do if i < cols then i " printfn "" // Creates and initializes a new Array of type int. let myIntArray = [| 1..5 |] // Creates and initializes a new Array of type Object. let myObjArray = Array.init 5 (fun i -> i + 26 :> obj) // Displays the initial values of both arrays. printfn "int array:" printValues myIntArray printfn "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. printfn "int array - Last two elements should now be the same as Object array:" printValues myIntArray printfn "Object array - First element should now be the same as int array:" printValues myObjArray // 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 
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 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", 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 */ 
Public Class SamplesArray Public Shared Sub Main() ' Creates and initializes a new Array of type Int32. Dim myIntArray As Array = _ Array.CreateInstance(GetType(System.Int32), 5) Dim i As Integer For i = myIntArray.GetLowerBound(0) To myIntArray.GetUpperBound(0) myIntArray.SetValue(i + 1, i) Next i ' Creates and initializes a new Array of type Object. Dim myObjArray As Array = _ Array.CreateInstance(GetType(System.Object), 5) For i = myObjArray.GetLowerBound(0) To myObjArray.GetUpperBound(0) myObjArray.SetValue(i + 26, i) Next i ' Displays the initial values of both arrays. Console.WriteLine("Int32 array:") PrintValues(myIntArray) Console.WriteLine("Object array:") PrintValues(myObjArray) ' Copies the first element from the Int32 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 Int32 array. Array.Copy(myObjArray, myObjArray.GetUpperBound(0) - 1, myIntArray, _ myIntArray.GetUpperBound(0) - 1, 2) ' Displays the values of the modified arrays. Console.WriteLine("Int32 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 Int32 array:") PrintValues(myObjArray) End Sub Public Shared Sub PrintValues(myArr As Array) Dim myEnumerator As System.Collections.IEnumerator = _ myArr.GetEnumerator() Dim i As Integer = 0 Dim cols As Integer = myArr.GetLength((myArr.Rank - 1)) While myEnumerator.MoveNext() If i < cols Then i += 1 Else Console.WriteLine() i = 1 End If Console.Write(ControlChars.Tab + "", myEnumerator.Current) End While Console.WriteLine() End Sub End Class ' This code produces the following output. ' ' Int32 array: ' 1 2 3 4 5 ' Object array: ' 26 27 28 29 30 ' Int32 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 Int32 array: ' 1 27 28 29 30 

Copy(Array, Array, Int32)

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

public: static void Copy(Array ^ sourceArray, Array ^ destinationArray, int length);
public static void Copy (Array sourceArray, Array destinationArray, int length);
static member Copy : Array * Array * int -> unit
Public Shared Sub Copy (sourceArray As Array, destinationArray As Array, length As Integer)
Параметры

sourceArray Array

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

destinationArray Array

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

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

Исключения

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

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

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

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

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

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

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

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

Комментарии

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

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

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

Этот метод эквивалентен стандартной функции memmove C/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

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

  • ConstrainedCopy(Array, Int32, Array, Int32, Int32)
  • Clone()

Копирование из одного массива в другой - C (СИ)

Какой из способов наиболее эффективный и почему? Так же интересует почему изменения в функции copy над переменными to и from влияют на значения переменных с такими же именами которые находятся за пределами этой функции? Ведь в Си аргументы передаются по значению, если явно не использовать указатель? И еще пара вопросов: 1. Почему при создании

можно не указывать размер массива а сразу заполнять его символами в двойных кавычках? Например char *from = "Hello"; Чем отличается такая запись от явного указания длины с массивом? Правильно ли я понимаю, что запись char *from = "Hello"; является упрощенной версией как если бы мы использовали malloc? 2. Если явно не написать \0 в конце строки, то добавляется ли этот символ автоматически?

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

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

Массив = Новый Массив();
Массив.Добавить(1);
Массив.Добавить(2);
фМвссив = Новый ФиксированныйМассив(Массив);
Массив2 = Новый Массив(фМассив);

ща, минуту, кофе допью и буду проводить испытания
передать в функцию по значению
(0) в последнем операторе ошибка
(2) А это как?
(3) Орфографическая?
(2) не взлетит
(5) смысловая, конструктор массива принимает в качестве аргументов только целые числа
(6) У меня работает. Может это из за 8.3? Забыл про это написать.
(4) функция блабла(Знач массив)

Вот так у меня
Массив = Новый Массив();
Массив.Добавить(1);
Массив.Добавить(2);
фМассив = Новый ФиксированныйМассив(Массив);
Массив2 = Новый Массив(фМассив);

(8) А как это поможет копию создать? Мне не передать а скопировать надо. В текущей Прцедуре.

(9) Вроде работает. Вот только как проверить не ссылка ли копируется и не становится ли исходный массив неизменяемым?

(10) никак не поможет
(10) можно еще в список значений загрузить, а потом выгрузить

ВыгрузитьЗначения()
Возвращаемое значение:

Создает массив и копирует в него значения элементов списка значений.

Как скопировать один массив в другой java

Для копирования одного массива в другой в Java можно использовать метод System.arraycopy() или использовать цикл for для копирования каждого элемента в новый массив.

Пример использования System.arraycopy() :

int[] source = 1, 2, 3, 4, 5>; int[] destination = new int[source.length]; System.arraycopy(source, 0, destination, 0, source.length); System.out.println(Arrays.toString(destination )); // => [1, 2, 3, 4, 5] 

Пример использования цикла for :

int[] source = 1, 2, 3, 4, 5>; int[] destination = new int[source.length]; for (int i = 0; i  source.length; i++)  destination[i] = source[i]; > 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *