Как скопировать string[]
из другого string[]
?
Предположим, что у меня есть string[] args
. Как я могу скопировать его в другой массив string[] args1
?
Как скопировать string[]
из другого string[]
?
Предположим, что у меня есть string[] args
. Как я могу скопировать его в другой массив string[] args1
?
Выделите пространство для целевого массива, в котором используется Array.CopyTo():
targetArray = new string[sourceArray.Length];
sourceArray.CopyTo( targetArray, 0 );
Array.Clone
и просто введите результат.Array.Copy
или Array.CopyTo
Например:
using System;
class Test
{
static void Main(string[] args)
{
// Clone the whole array
string[] args2 = (string[]) args.Clone();
// Copy the five elements with indexes 2-6
// from args into args3, stating from
// index 2 of args3.
string[] args3 = new string[5];
Array.Copy(args, 2, args3, 0, 5);
// Copy whole of args into args4, starting from
// index 2 (of args4)
string[] args4 = new string[args.Length+2];
args.CopyTo(args4, 2);
}
}
Предполагая, что мы начинаем с args = { "a", "b", "c", "d", "e", "f", "g", "h" }
, получаем:
args2 = { "a", "b", "c", "d", "e", "f", "g", "h" }
args3 = { "c", "d", "e", "f", "g" }
args4 = { null, null, "a", "b", "c", "d", "e", "f", "g", "h" }
В приведенных выше ответах показан неглубокий клон; поэтому я подумал, что я добавляю пример глубокого клонирования, используя сериализацию; конечно, глубокий клон можно также сделать, перейдя через исходный массив и скопировав каждый элемент в новый массив.
private static T[] ArrayDeepCopy<T>(T[] source)
{
using (var ms = new MemoryStream())
{
var bf = new BinaryFormatter{Context = new StreamingContext(StreamingContextStates.Clone)};
bf.Serialize(ms, source);
ms.Position = 0;
return (T[]) bf.Deserialize(ms);
}
}
Тестирование глубокого клона:
private static void ArrayDeepCloneTest()
{
//a testing array
CultureInfo[] secTestArray = { new CultureInfo("en-US", false), new CultureInfo("fr-FR") };
//deep clone
var secCloneArray = ArrayDeepCopy(secTestArray);
//print out the cloned array
Array.ForEach(secCloneArray, x => Console.WriteLine(x.DateTimeFormat.DateSeparator));
//modify the original array
secTestArray[0].DateTimeFormat.DateSeparator = "-";
Console.WriteLine();
//show the (deep) cloned array unchanged whereas a shallow clone would reflect the change...
Array.ForEach(secCloneArray, x => Console.WriteLine(x.DateTimeFormat.DateSeparator));
}