Làm cách nào để sao chép string[]
từ một số khác string[]
?Sao chép một mảng chuỗi sang một chuỗi khác
Giả sử tôi có string[] args
. Làm thế nào tôi có thể sao chép nó vào một mảng khác string[] args1
?
Làm cách nào để sao chép string[]
từ một số khác string[]
?Sao chép một mảng chuỗi sang một chuỗi khác
Giả sử tôi có string[] args
. Làm thế nào tôi có thể sao chép nó vào một mảng khác string[] args1
?
Phân bổ không gian cho các mảng mục tiêu, sử dụng Array.CopyTo():
targetArray = new string[sourceArray.Length];
sourceArray.CopyTo(targetArray, 0);
Array.Clone
và chỉ đúc kết quả.Array.Copy
hoặc Array.CopyTo
Ví dụ:
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);
}
}
Giả sử chúng ta bắt đầu với args = { "a", "b", "c", "d", "e", "f", "g", "h" }
kết quả là:
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" }
Hi Jon, tại sao mảng chuỗi nhân bản một bản sao 'sâu'? Ý tôi là tôi biết Array.Clone() là một bản sao nông; trong khi nó làm một bản sao nông trên các loại tài liệu tham khảo khác (ví dụ CultureInfo) bằng cách nào đó nó làm một bản sao 'sâu' trên mảng chuỗi. Ví dụ, nếu tôi sao chép một mảng chứa "Hello", "World"; sau bản sao, tôi đặt phần tử đầu tiên thành null. Sau đó, tôi mong đợi phần tử thứ nhất của mảng nhân bản cũng sẽ là null nhưng nó vẫn là Hello. Hy vọng bạn biết những gì tôi có nghĩa là không có thể hiển thị mẫu mã trong bình luận. – stt106
@ stt106: Tại sao bạn mong đợi nó sẽ là rỗng? Nó tạo ra một bản sao nông, tức là tạo ra một mảng mới có cùng kích thước và sao chép từng giá trị từ mảng ban đầu vào mảng mới. Bạn sẽ thấy chính xác cùng một hành vi với 'CultureInfo'. –
Nhưng các tham chiếu trong điểm Mảng mới đến các đối tượng ** tương tự ** mà các tham chiếu trong điểm Mảng gốc đến; do đó nếu mảng ban đầu hoặc nhân bản (mới) được sửa đổi thì mảng kia cũng phải phản ánh sửa đổi **? – stt106
Các câu trả lời ở trên cho thấy bản sao nông; vì vậy tôi nghĩ rằng tôi thêm một ví dụ clone sâu bằng cách sử dụng serialization; tất nhiên một bản sao sâu cũng có thể được thực hiện bằng cách lặp qua mảng ban đầu và sao chép từng phần tử vào một mảng hoàn toàn mới.
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);
}
}
Kiểm tra clone sâu:
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));
}
Sử dụng Clone() làm cho trường hợp cụ thể này một lớp lót mặc dù. –