Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

วิธีคัดลอก List Collection ไปยัง Array ใน C#

วิธีหลัก: ใช้ CopyTo() Method

คัดลอกข้อมูลจาก List ไปยัง Array ที่สร้างไว้ล่วงหน้า

ขั้นตอน

  1. สร้าง List และเพิ่มข้อมูล
  2. สร้าง Array ขนาด ≥ List.Count
  3. เรียก 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() จะ Throw ArgumentException ถ้า 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();