0Pricing
C# Academy · บทเรียน

การใช้งานรายการจริง

เพิ่ม ลบ และค้นหา

การใช้งานรายการจริง เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงใช้ List<T>

List<T> คืออาร์เรย์แบบปรับขนาดได้ที่ใช้กันทั่วไปในภาษา C# โดยอยู่ใน System.Collections.Generic และจะขยายขนาดโดยอัตโนมัติเมื่อคุณเพิ่มรายการ

ต่างจากอาร์เรย์ทั่วไปตรงที่คุณไม่จำเป็นต้องกำหนดขนาดตายตัวล่วงหน้า อีกทั้งยังปลอดภัยด้านชนิดข้อมูลด้วย โดย List<int> จะเก็บได้เฉพาะค่า int และตรวจพบข้อผิดพลาดตั้งแต่เวลาคอมไพล์

using System.Collections.Generic;

List<int> scores = new List<int>();
scores.Add(90);
scores.Add(85);

การสร้างและกำหนดค่าเริ่มต้น

คุณสามารถเติมรายการได้ทันทีโดยใช้ตัวกำหนดค่าเริ่มต้นของชุดข้อมูล วิธีนี้กระชับและอ่านง่าย

เบื้องหลังตัวแปลโปรแกรมจะแปลงแต่ละรายการเป็นการเรียกใช้ Add ดังนั้นผลลัพธ์จึงเหมือนกับการเพิ่มรายการทีละรายการ

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var fruits = new List<string> { "apple", "pear", "plum" };
        Console.WriteLine(fruits.Count);
    }
}

การใช้ดัชนีและการนับจำนวน

เข้าถึงสมาชิกด้วยดัชนีที่เริ่มนับจากศูนย์ เช่นเดียวกับอาร์เรย์ list[0] คือรายการแรก

ใช้ Count ไม่ใช่ Length เพื่อดูว่ารายการเก็บสมาชิกไว้กี่รายการ การอ่านหรือเขียนด้วยดัชนีใช้เวลาคงที่ O(1)

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var nums = new List<int> { 10, 20, 30 };
        Console.WriteLine(nums[1]);
        Console.WriteLine(nums.Count);
    }
}

การเพิ่มและการแทรก

Add จะเพิ่มรายการต่อท้ายด้วยเวลา O(1) โดยเฉลี่ยแบบสะสม ส่วน AddRange จะเพิ่มหลายรายการพร้อมกัน

Insert(index, item) จะวางรายการไว้ที่ตำแหน่งหนึ่งและเลื่อนทุกอย่างหลังจากนั้น การเลื่อนนี้ทำให้การใช้ Insert ที่ด้านหน้าใช้เวลา O(n) ดังนั้นหากทำได้ ควรเพิ่มรายการต่อท้าย

var list = new List<string> { "b", "c" };
list.Insert(0, "a");
list.AddRange(new[] { "d", "e" });
// list is now a, b, c, d, e

การลบรายการ

Remove(item) จะลบค่าที่ตรงกันรายการแรกและคืนค่า true หากพบ ส่วน RemoveAt(index) จะลบตามตำแหน่ง

ทั้งสองวิธีจะเลื่อนสมาชิกถัดไปไปทางซ้าย ดังนั้นการลบจากตรงกลางจึงใช้เวลา O(n) ส่วน RemoveAll รับเงื่อนไขคัดเลือกและลบรายการที่ตรงกันทั้งหมดในรอบเดียว

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var nums = new List<int> { 1, 2, 3, 4, 5 };
        nums.RemoveAll(n => n % 2 == 0);
        Console.WriteLine(string.Join(",", nums));
    }
}

การค้นหาในรายการ

Contains จะบอกว่ามีค่านั้นอยู่หรือไม่ ส่วน IndexOf จะให้ตำแหน่งของค่า หรือ -1 หากไม่พบ ทั้งสองวิธีค้นหาแบบเชิงเส้นและใช้เวลา O(n)

หากคุณต้องค้นหารายการขนาดใหญ่ด้วยค่าซ้ำ ๆ ต้นทุนแบบเชิงเส้นนี้จะสะสมขึ้นเรื่อย ๆ HashSet หรือ Dictionary อาจเหมาะสมกว่า

var names = new List<string> { "Ann", "Bob", "Cy" };
bool hasBob = names.Contains("Bob");   // true
int pos = names.IndexOf("Cy");          // 2

การวนซ้ำ

ลูป foreach เป็นวิธีที่อ่านเข้าใจได้ง่ายที่สุดในการอ่านสมาชิกทุกตัว คุณยังสามารถใช้ลูป for แบบดั้งเดิมเมื่อต้องการดัชนี

อย่าเพิ่มหรือลบรายการภายใน foreach ที่วนซ้ำบนรายการเดียวกัน เพราะจะทำให้เกิด InvalidOperationException

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var colors = new List<string> { "red", "green", "blue" };
        foreach (var c in colors)
            Console.WriteLine(c);
    }
}

การเรียงลำดับ

Sort() จะเรียงลำดับรายการอยู่ภายในรายการเดิมโดยใช้ตัวเปรียบเทียบเริ่มต้น หากต้องการลำดับแบบกำหนดเอง ให้ส่งตัวมอบหมายการเปรียบเทียบ

การเรียงลำดับใช้เวลา O(n log n) หากต้องการ copy ที่เรียงลำดับแล้วโดยไม่เปลี่ยนแปลงค่า original ให้ใช้ OrderBy ของ LINQ ซึ่งจะคืนลำดับชุดใหม่

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var nums = new List<int> { 4, 1, 3, 2 };
        nums.Sort();
        Console.WriteLine(string.Join(",", nums));
    }
}

ความจุเทียบกับจำนวนสมาชิก

Count คือจำนวนรายการที่มีอยู่ ส่วน Capacity คือจำนวนรายการที่เก็บได้ก่อนต้องจัดสรรอาร์เรย์ภายในใหม่

เมื่อรายการมีขนาดเกินความจุ ระบบจะจัดสรรอาร์เรย์ที่ใหญ่ขึ้นและคัดลอกรายการ โดยโดยประมาณจะเพิ่มเป็นสองเท่า หากคุณทราบขนาดสุดท้าย ให้ส่งขนาดนั้นไปยังตัวสร้างเพื่อหลีกเลี่ยงการคัดลอกซ้ำ

var list = new List<int>(1000); // reserve capacity
for (int i = 0; i < 1000; i++)
    list.Add(i);
// no intermediate reallocations

List ในฐานะอาร์กิวเมนต์ของวิธีการ

List<T> เป็นชนิดอ้างอิง การส่งไปยังวิธีการจะเป็นการส่งข้อมูลอ้างอิง ดังนั้นการเปลี่ยนแปลงภายในวิธีการจึงส่งผลต่อรายการของผู้เรียก

หากวิธีการเพียงอ่านข้อมูล ให้รับ IEnumerable<T> หรือ IReadOnlyList<T> เพื่อสื่อว่าจะไม่แก้ไขรายการ

using System;
using System.Collections.Generic;

class Program {
    static void AddOne(List<int> xs) => xs.Add(1);
    static void Main() {
        var nums = new List<int>();
        AddOne(nums);
        Console.WriteLine(nums.Count); // 1
    }
}

การแปลงและการคัดลอก

ToArray() จะสร้างอาร์เรย์ขนาดตายตัว ส่วน new List<T>(other) จะสร้างสำเนาแบบตื้นของชุดข้อมูลอื่น

สำเนาแบบตื้นจะทำซ้ำโครงสร้างรายการ แต่ใช้ข้อมูลอ้างอิงของสมาชิกชุดเดิมร่วมกัน ดังนั้นการเปลี่ยนแปลงวัตถุที่อยู่ภายในจึงมองเห็นได้จากทั้งสองรายการ

var original = new List<int> { 1, 2, 3 };
int[] arr = original.ToArray();
var copy = new List<int>(original);

ตรวจสอบความเข้าใจ

เลือกการดำเนินการที่มีต้นทุนแตกต่างอย่างเห็นได้ชัด

สรุปทบทวน

List<T> คืออาร์เรย์ที่ขยายขนาดได้และปลอดภัยด้านชนิดข้อมูล การเข้าถึงด้วยดัชนีและ Count ใช้เวลา O(1) ส่วนการใช้ Add ต่อท้ายใช้เวลา O(1) โดยเฉลี่ยแบบสะสม

การแทรก การลบ และการค้นหาด้วยค่าในบริเวณตรงกลางใช้เวลา O(n) เนื่องจากต้องเลื่อนหรือค้นหา หากทราบขนาดล่วงหน้า ให้สำรองความจุไว้เพื่อหลีกเลี่ยงการจัดสรรใหม่

คำถามที่พบบ่อย

บทเรียน “การใช้งานรายการจริง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การใช้งานรายการจริง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การใช้งานรายการจริง”

เพิ่ม ลบ และค้นหา คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “การใช้งานรายการจริง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การใช้งานรายการจริง
  2. การค้นหาในพจนานุกรม
  3. HashSet และความไม่ซ้ำกัน
  4. เลือกคอลเลกชัน
← กลับไปที่ C# Academy