วิธีหลัก: ใช้ CopyTo() Method
คัดลอกข้อมูลจาก List ไปยัง Array ที่สร้างไว้ล่วงหน้า
ขั้นตอน
- สร้าง List และเพิ่มข้อมูล
- สร้าง Array ขนาด ≥ List.Count
- เรียก
list.CopyTo(array)
โค้ดตัวอย่างสมบูรณ์
using System;
using System.Collections.Generic;
using System.Linq;
public class Demo {
public static void Main() {
// 1. สร้าง List
List list1 = new List();
list1.Add("One");
list1.Add("Two");
list1.Add("Three");
list1.Add("Four");
Console.WriteLine("First list...");
foreach (string value in list1) {
Console.WriteLine(value);
}
// 2. สร้าง Array (ขนาด 20 > 4 Items)
string[] arr = new string[20];
// 3. คัดลอก
list1.CopyTo(arr);
Console.WriteLine("\nAfter copy...");
foreach (string value in arr) {
Console.WriteLine(value ?? "(null)");
}
}
}
ผลลัพธ์
First list...
One
Two
Three
Four
After copy...
One
Two
Three
Four
(null)
(null)
...
(null) <- เหลือ 16 ช่องเป็น null
วิธีที่แนะนำมากกว่า: ToArray()
สร้าง Array ใหม่ขนาดพอดีกับข้อมูลโดยอัตโนมัติ
// แปลง List เป็น Array ขนาดพอดี
string[] arr = list1.ToArray();
// arr.Length == list1.Count เสมอ
Console.WriteLine(arr.Length); // 4
วิธีอื่นๆ
1. Array.Copy (Low-level, เร็วที่สุด)
string[] arr = new string[list1.Count];
Array.Copy(list1.ToArray(), arr, list1.Count);
2. LINQ Select
// แปลงพร้อม Transform
string[] upper = list1.Select(s => s.ToUpper()).ToArray();
3. CopyTo With Index (คัดลอกบางส่วน)
string[] arr = new string[10];
list1.CopyTo(arr, 2); // เริ่มวางที่ Index 2 ของ Array
ตารางเปรียบเทียบ
| วิธี | ขนาด Array ผลลัพธ์ | ต้องสร้าง Array ก่อน? | คัดลอกบางส่วนได้? | Performance |
|---|---|---|---|---|
ToArray() |
พอดี (Count) | ไม่ต้อง | ไม่ได้ (ต้อง LINQ) | ดี |
CopyTo(array) |
ตาม Array ที่สร้าง | ต้อง | ได้ (CopyTo(array, index)) | ดี |
Array.Copy |
กำหนดเอง | ต้อง | ได้ (ระบุ srcIndex, dstIndex, length) | ดีที่สุด |
⚠️ ข้อควรระวัง
CopyTo()จะ ThrowArgumentExceptionถ้า Array เล็กกว่า List.Count- ทั้งสองเป็น Shallow Copy - Reference Type จะ Share Object เดียวกัน
- ใช้
ToArray()สำหรับกรณีทั่วไป - สะดวก ปลอดภัย ขนาดพอดี
Deep Copy สำหรับ Reference Types
// Manual Deep Copy
string[] deepCopy = list1.Select(s => string.Copy(s)).ToArray();
// หรือ Clone ถ้า Object รองรับ ICloneable
MyClass[] deepCopy = list1.Select(x => (MyClass)x.Clone()).ToArray();