การใช้งานรายการจริง
เพิ่ม ลบ และค้นหา
การใช้งานรายการจริง เป็นบทเรียน 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 reallocationsList ในฐานะอาร์กิวเมนต์ของวิธีการ
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การใช้งานรายการจริง
- การค้นหาในพจนานุกรม
- HashSet และความไม่ซ้ำกัน
- เลือกคอลเลกชัน