บทช่วยสอนคอลเลกชัน C # พร้อมตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
คอลเลกชันใน C# เป็นวิธีที่ยืดหยุ่นในการจัดเก็บและจัดการกลุ่มของวัตถุ แตกต่างจากอาร์เรย์ คอลเลกชันจะขยายและหดตัวในขณะรันไทม์ และเนมสเปซ System.Collections และ System.Collections.Generic มีประเภทสำเร็จรูปสำหรับลิสต์ พจนานุกรม สแต็ก และคิว

ในบทช่วยสอนก่อนหน้านี้ เราได้เรียนรู้เกี่ยวกับวิธีการใช้อาร์เรย์ใน C# มาดูภาพรวมโดยย่อกันดีกว่า อาร์เรย์ในการเขียนโปรแกรมใช้เพื่อจัดกลุ่มชุดของวัตถุที่เกี่ยวข้องกัน ดังนั้นเราสามารถสร้างอาร์เรย์หรือชุดของจำนวนเต็มซึ่งสามารถเข้าถึงได้ผ่านชื่อตัวแปรเดียว
คอลเลกชันใน C # คืออะไร?
คอลเลกชันจะคล้ายกับ อาร์เรย์ซึ่งช่วยให้ทำงานกับกลุ่มอ็อบเจ็กต์ได้อย่างยืดหยุ่นมากขึ้น
ในอาร์เรย์ คุณจะสังเกตเห็นว่าคุณจำเป็นต้องกำหนดจำนวนองค์ประกอบในอาร์เรย์ล่วงหน้า สิ่งนี้จะต้องทำเมื่อมีการประกาศอาร์เรย์
แต่ในคอลเลกชัน คุณไม่จำเป็นต้องกำหนดขนาดของคอลเลกชันล่วงหน้า คุณสามารถเพิ่มองค์ประกอบหรือลบองค์ประกอบออกจากคอลเลกชันเมื่อใดก็ได้ บทนี้จะเน้นไปที่วิธีที่เราสามารถทำงานกับคอลเลกชันต่างๆ ที่มีอยู่ใน C#
คลาส System.Collections
.NET Framework จัดกลุ่มคลาสคอลเลกชันที่ไม่ใช่เจเนริกแบบดั้งเดิมไว้ในเนมสเปซ System.Collections ตารางด้านล่างสรุปประเภทหลักที่คุณสามารถใช้งานได้ทันที
| ชุด | Descriptไอออน |
| รายการอาร์เรย์ | คอลเลกชัน ArrayList จะคล้ายกับอาร์เรย์ ชนิดข้อมูลใน C#- ความแตกต่างที่ใหญ่ที่สุดคือลักษณะไดนามิกของคอลเลกชันรายการอาร์เรย์ |
| กอง | โครงสร้างแบบสแต็กเป็นโครงสร้างข้อมูลแบบพิเศษที่แสดงถึงแนวคิดการเข้าหลังออกก่อน (LIFO) |
| คิว | คิวเป็นกรณีพิเศษของการรวบรวมข้อมูลที่แสดงถึงแนวคิดเข้าก่อนออกก่อน (first in first out) |
| แฮชเทเบิล | ตารางแฮชเป็นโครงสร้างข้อมูลพิเศษที่ใช้สำหรับจัดเก็บรายการแบบคู่คีย์-ค่า |
| เรียงลำดับรายการ | SortedList คือคอลเลกชันที่เก็บคู่คีย์-ค่าตามลำดับคีย์จากน้อยไปมากตามค่าเริ่มต้น |
| BitArray | อาร์เรย์บิตคืออาร์เรย์ของโครงสร้างข้อมูลที่จัดเก็บบิต |
คอลเลกชันทั่วไปใน C#
คลาสที่ไม่ใช่แบบเจเนริกข้างต้นจะเก็บองค์ประกอบทุกอย่างไว้เป็นอ็อบเจ็กต์ทั่วไป ซึ่งหมายความว่าคอมไพเลอร์ไม่สามารถตรวจสอบประเภทได้ และโปรแกรมจะต้องเสียค่าใช้จ่ายเล็กน้อยสำหรับการแปลงค่า เพื่อแก้ไขปัญหานี้ C# จึงเพิ่มเนมสเปซ System.Collections.Generic เข้ามา โดยที่แต่ละคอลเลกชันจะผูกอยู่กับประเภทที่ประกาศไว้เพียงประเภทเดียว
ชุดข้อมูลทั่วไป เช่น รายการ (List) รับเฉพาะสตริงเท่านั้น ดังนั้นข้อผิดพลาดจะถูกตรวจจับได้ในระหว่างการคอมไพล์ และไม่จำเป็นต้องแปลงประเภทเมื่ออ่านค่ากลับมา ทำให้คอลเลกชันแบบเจเนริกมีความปลอดภัย รวดเร็ว และอ่านง่ายกว่า ซึ่งเป็นเหตุผลว่าทำไมจึงเป็นตัวเลือกเริ่มต้นในโค้ด C# สมัยใหม่
ชุดสะสมทั่วไปที่พบได้บ่อยที่สุดมีดังต่อไปนี้:
- รายการ : รายการแบบปรับขนาดได้โดยใช้ดัชนี เป็นตัวแทนทั่วไปของ ArrayList
- พจนานุกรม : จัดเก็บคู่คีย์-ค่าด้วยการค้นหาที่รวดเร็วโดยใช้แฮช
- ชุดแฮช : เก็บเฉพาะค่าที่ไม่ซ้ำกันและรองรับการดำเนินการเซต เช่น การรวม (union)
- คิว : ระบบจัดเก็บข้อมูลแบบเข้าก่อนออกก่อน (First In First Out) ซึ่งเป็นรูปแบบทั่วไปของระบบคิว (Queue)
- ซ้อนกัน : คอลเลกชันแบบเข้าหลังออกก่อน (Last-in first-out) ซึ่งเป็นเวอร์ชันทั่วไปของ Stack
- รายการที่เรียงลำดับ : เก็บคู่คีย์-ค่าโดยเรียงลำดับตามคีย์จากน้อยไปมาก
ตัวอย่างการสร้างคอลเลกชันรายการใน C#
List เป็นคอลเลกชันทั่วไปที่ใช้กันอย่างแพร่หลายที่สุด เนื่องจากมีลักษณะการทำงานคล้ายกับอาร์เรย์แบบไดนามิก ตัวอย่างด้านล่างสร้างลิสต์ของสตริง เพิ่มและลบรายการ อ่านขนาดของลิสต์ แล้วพิมพ์ค่าที่เหลืออยู่ โค้ดทั้งหมดเขียนอยู่ในไฟล์ Program.cs
ขั้นตอน 1) นำเข้าเนมสเปซ System.Collections.Generic และประกาศลิสต์ของสตริง
ขั้นตอน 2) เพิ่มรายการโดยใช้วิธี Add และลบรายการโดยใช้วิธี Remove
ขั้นตอน 3) อ่านค่าคุณสมบัติ Count จากนั้นวนลูปผ่านรายการด้วยคำสั่ง foreach
using System; using System.Collections.Generic; namespace DemoApplication { class Program { static void Main(string[] args) { List<string> tutorials = new List<string>(); tutorials.Add("Java"); tutorials.Add("Python"); tutorials.Add("Kotlin"); tutorials.Remove("Python"); Console.WriteLine(tutorials.Count); foreach (string tutorial in tutorials) { Console.WriteLine(tutorial); } Console.ReadKey(); } } }
Code คำอธิบาย:-
- มีการนำเข้าเนมสเปซ System.Collections.Generic เพื่อให้โปรแกรมสามารถใช้งานประเภท List ได้
- รายการใหม่ มีการสร้างโฟลเดอร์ชื่อ tutorials และเพิ่มชื่ออีกสามชื่อโดยใช้วิธี Add
- เมธอด Remove จะลบค่า “Pythonซึ่งทำให้เหลือสองรายการในรายการ
- คุณสมบัติ Count จะส่งคืนจำนวนรายการ และลูป foreach จะพิมพ์ค่าที่เหลือแต่ละรายการตามลำดับ
เมื่อโปรแกรมทำงาน ขั้นแรกจะพิมพ์จำนวนของ 2, ติดตามโดย Java และ คอตลิน แยกเป็นบรรทัดๆ นี่แสดงให้เห็นว่าคอลเลกชันเปลี่ยนแปลงขนาดได้ในขณะรันไทม์ ซึ่งเป็นสิ่งที่อาร์เรย์แบบคงที่ทำไม่ได้
ความแตกต่างระหว่างอาร์เรย์และคอลเลกชันใน C#
ทั้งสอง แถว และกลุ่มของรายการที่เกี่ยวข้องจะถูกจัดกลุ่มไว้ภายใต้ชื่อเดียวกัน แต่พวกมันจะมีพฤติกรรมที่แตกต่างกันเมื่อโปรแกรมเริ่มทำงาน การรู้ว่าควรใช้แต่ละแบบเมื่อใดจะช่วยให้คุณเขียนโค้ดได้สะอาดและมีประสิทธิภาพมากขึ้น
ความแตกต่างหลักๆ มีดังต่อไปนี้:
- ขนาด: อาร์เรย์มีความยาวคงที่ซึ่งกำหนดไว้ตั้งแต่การประกาศ ในขณะที่คอลเลกชันสามารถเพิ่มหรือลดขนาดได้ตลอดเวลา
- การจัดการประเภท: อาร์เรย์จะเก็บข้อมูลประเภทเดียว ในขณะที่คอลเลกชันสามารถมีความปลอดภัยทางประเภทเมื่อใช้เจเนริก หรือเก็บวัตถุที่มีประเภทผสมกันได้เมื่อไม่ใช้เจเนริก
- ที่ตั้ง: อาร์เรย์มีอยู่ในตัวภาษาอยู่แล้ว ในขณะที่คลาสคอลเลกชันจะอยู่ในเนมสเปซ System.Collections และ System.Collections.Generic
- การทำงานในตัว: คอลเลกชันมีวิธีการที่พร้อมใช้งานสำหรับการเพิ่ม ลบ ค้นหา และจัดเรียงรายการ ในขณะที่อาร์เรย์ให้การเข้าถึงแบบดัชนีขั้นพื้นฐานเท่านั้น
- การใช้งานที่ดีที่สุด: เลือกใช้อาร์เรย์เมื่อทราบจำนวนรายการและคงที่ และเลือกใช้คอลเลกชันเมื่อจำนวนรายการเปลี่ยนแปลงขณะที่โปรแกรมทำงาน
โดยสรุปแล้ว อาร์เรย์เหมาะที่สุดสำหรับข้อมูลที่มีขนาดคงที่ ในขณะที่คอลเลกชันให้ความยืดหยุ่นที่แอปพลิเคชันในโลกแห่งความเป็นจริงส่วนใหญ่ต้องการ
