Array.CopyTo() - คัดลอกข้อมูลไปยัง Array อื่น
คัดลอกสมาชิกทั้งหมดของ Array แบบ 1 มิติ ไปยัง Array ปลายทาง ตั้งแต่ Index ที่ระบุ
Syntax
public void CopyTo(Array array, int index)
ตัวอย่าง CopyTo()
using System;
class Program {
static void Main() {
int[] arrSource = { 5, 9, 1, 3 };
int[] arrTarget = new int[4];
// คัดลอกทั้งหมดไปยัง Index 0 ของ Target
arrSource.CopyTo(arrTarget, 0);
Console.WriteLine("Destination Array:");
foreach (int value in arrTarget) {
Console.WriteLine(value);
}
}
}
ผลลัพธ์
Destination Array:
5
9
1
3
Array.Clone() - สร้าง Shallow Copy ของ Array
สร้าง Array ใหม่ที่มีสมาชิกเหมือนกันทุกตัว (Shallow Copy - Reference Types จะอ้างอิง Object เดิม)
Syntax
public object Clone()
ตัวอย่าง Clone()
using System;
class Program {
static void Main() {
string[] arr = { "one", "two", "three", "four", "five" };
// Clone ต้อง Cast กลับมาที่ Type เดิม
string[] arrCloned = arr.Clone() as string[];
Console.WriteLine("Original: " + string.Join(",", arr));
Console.WriteLine("Cloned: " + string.Join(",", arrCloned));
// ทดสอบว่าเป็น Object เดียวกันหรือไม่ (Reference Type)
arr[0] = "CHANGED";
Console.WriteLine("\nAfter changing arr[0]:");
Console.WriteLine("Original: " + string.Join(",", arr));
Console.WriteLine("Cloned: " + string.Join(",", arrCloned));
}
}
ผลลัพธ์
Original: one,two,three,four,five
Cloned: one,two,three,four,five
After changing arr[0]:
Original: CHANGED,two,three,four,five
Cloned: CHANGED,two,three,four,five ← เปลี่ยนด้วย! (Shallow Copy)
ตารางเปรียบเทียบสรุป
| คุณสมบัติ | Array.CopyTo() | Array.Clone() |
|---|---|---|
| วัตถุประสงค์ | คัดลอกข้อมูลไป Array ที่มีอยู่แล้ว | สร้าง Array ใหม่ที่เหมือนกัน |
| คืนค่า | void | object (ต้อง Cast) |
| Array ปลายทาง | ต้องสร้างไว้ก่อน | สร้างใหม่อัตโนมัติ |
| ขนาด Array ปลายทาง | ต้องพอหรือใหญ่กว่า | เท่ากับต้นทางเสมอ |
| ประเภทการคัดลอก | Shallow Copy | Shallow Copy |
| คัดลอกบางส่วนได้ไหม | ได้ (ระบุ Index) | ไม่ได้ (คัดลอกทั้ง Array) |
| หลายมิติ (Multi-dim) | ไม่ได้ (1D เท่านั้น) | ได้ (รักษา Rank/Dimensions) |
Deep Copy สำหรับ Reference Types
ถ้าต้องการ Deep Copy (คัดลอก Object จริง ไม่ใช่ Reference):
// Manual Deep Copy
string[] deepCopy = new string[arr.Length];
for (int i = 0; i < arr.Length; i++) {
deepCopy[i] = string.Copy(arr[i]); // String เป็น Immutable จึง Copy ได้
}
// หรือใช้ LINQ
string[] deepCopy = arr.Select(s => string.Copy(s)).ToArray();
// สำหรับ Object แบบ Custom - ต้อง Implement ICloneable หรือ Copy Constructor
Array.Copy() Static Method (ทางเลือกอื่น)
// คัดลอกบางส่วน ระบุ Source Index, Dest Index, Length
Array.Copy(sourceArray, 0, destArray, 2, 3); // คัดลอก 3 ตัวจากต้นทาง[0] ไปปลายทาง[2]