2009-05-20 51 views

Trả lời

17

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); 
+4

Sử dụng Clone() làm cho trường hợp cụ thể này một lớp lót mặc dù. –

27
  • Để tạo một mảng hoàn toàn mới với những nội dung tương tự (như là một bản sao cạn): gọi Array.Clone và chỉ đúc kết quả.
  • Để sao chép một phần của một mảng chuỗi thành một mảng chuỗi: gọi 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" } 
+0

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

+0

@ 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'. –

+0

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

0

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)); 
     } 
Các vấn đề liên quan