บทช่วยสอนคอลเลกชัน C # พร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

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

  • 🔃 การปรับขนาดแบบไดนามิก: คอลเลกชันจะเพิ่มและลบองค์ประกอบในระหว่างการทำงาน ดังนั้นคุณจึงไม่สามารถกำหนดขนาดล่วงหน้าได้เหมือนกับอาร์เรย์
  • 📚 เนมสเปซ: System.Collections เก็บประเภทที่ไม่ใช่เจเนริก ในขณะที่ System.Collections.Generic เก็บประเภทเจเนริกที่ปลอดภัยต่อประเภท
  • 🧱 วิชาหลัก: ArrayList, Stack, Queue, Hashtable, SortedList และ BitArray ครอบคลุมความต้องการทั่วไปที่ไม่ใช่แบบเจเนริก
  • พลังงานทั่วไป: List, Dictionary, HashSet และ Queue เพิ่มความปลอดภัยของประเภทข้อมูลในระหว่างการคอมไพล์และประสิทธิภาพที่ดีขึ้น
  • 🔑 ทางเลือกที่ถูกต้อง: ใช้ Dictionary สำหรับการค้นหาคีย์, List สำหรับรายการที่เรียงลำดับ และใช้ Stack หรือ Queue สำหรับการเรียงลำดับแบบ LIFO หรือ FIFO
  • 🤖 ความช่วยเหลือจากเอไอ: GitHub Copilot สร้างโครงร่างโค้ดสำหรับคอลเลกชัน และไปป์ไลน์ ML.NET ส่งข้อมูลผ่านประเภทคอลเลกชันทั่วไป

คอลเลกชันใน C#

ในบทช่วยสอนก่อนหน้านี้ เราได้เรียนรู้เกี่ยวกับวิธีการใช้อาร์เรย์ใน 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 คำอธิบาย:-

  1. มีการนำเข้าเนมสเปซ System.Collections.Generic เพื่อให้โปรแกรมสามารถใช้งานประเภท List ได้
  2. รายการใหม่ มีการสร้างโฟลเดอร์ชื่อ tutorials และเพิ่มชื่ออีกสามชื่อโดยใช้วิธี Add
  3. เมธอด Remove จะลบค่า “Pythonซึ่งทำให้เหลือสองรายการในรายการ
  4. คุณสมบัติ Count จะส่งคืนจำนวนรายการ และลูป foreach จะพิมพ์ค่าที่เหลือแต่ละรายการตามลำดับ

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

ความแตกต่างระหว่างอาร์เรย์และคอลเลกชันใน C#

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

ความแตกต่างหลักๆ มีดังต่อไปนี้:

  • ขนาด: อาร์เรย์มีความยาวคงที่ซึ่งกำหนดไว้ตั้งแต่การประกาศ ในขณะที่คอลเลกชันสามารถเพิ่มหรือลดขนาดได้ตลอดเวลา
  • การจัดการประเภท: อาร์เรย์จะเก็บข้อมูลประเภทเดียว ในขณะที่คอลเลกชันสามารถมีความปลอดภัยทางประเภทเมื่อใช้เจเนริก หรือเก็บวัตถุที่มีประเภทผสมกันได้เมื่อไม่ใช้เจเนริก
  • ที่ตั้ง: อาร์เรย์มีอยู่ในตัวภาษาอยู่แล้ว ในขณะที่คลาสคอลเลกชันจะอยู่ในเนมสเปซ System.Collections และ System.Collections.Generic
  • การทำงานในตัว: คอลเลกชันมีวิธีการที่พร้อมใช้งานสำหรับการเพิ่ม ลบ ค้นหา และจัดเรียงรายการ ในขณะที่อาร์เรย์ให้การเข้าถึงแบบดัชนีขั้นพื้นฐานเท่านั้น
  • การใช้งานที่ดีที่สุด: เลือกใช้อาร์เรย์เมื่อทราบจำนวนรายการและคงที่ และเลือกใช้คอลเลกชันเมื่อจำนวนรายการเปลี่ยนแปลงขณะที่โปรแกรมทำงาน

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

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

ใช้ Dictionary เมื่อคุณต้องการค้นหาข้อมูลอย่างรวดเร็วโดยใช้คีย์ที่ไม่ซ้ำกัน เช่น ID ที่เชื่อมโยงกับเรคอร์ด Dictionary ค้นหาค่าได้ในเวลาคงที่ ในขณะที่ List ต้องสแกนทีละรายการ

HashSet และ Dictionary ให้การค้นหาที่เร็วที่สุด เนื่องจากใช้การแฮชเพื่อเข้าถึงองค์ประกอบในเวลาคงที่เกือบตลอดเวลา ในขณะที่ List หรือ Array จะช้ากว่า เพราะอาจต้องตรวจสอบทุกองค์ประกอบตามลำดับ

คอลเลกชันแบบ Concurrent อยู่ในเนมสเปซ System.Collections.Concurrent และถูกสร้างขึ้นสำหรับโค้ดแบบมัลติเธรด ประเภทต่างๆ เช่น ConcurrentDictionary และ BlockingCollection ช่วยให้หลายเธรดสามารถเพิ่มและลบรายการได้อย่างปลอดภัยโดยไม่ต้องล็อกด้วยตนเอง

IEnumerable เป็นอินเทอร์เฟซพื้นฐานที่รองรับเฉพาะการอ่านรายการด้วยลูป foreach เท่านั้น ส่วน ICollection ขยายจาก IEnumerable และเพิ่มสมาชิก เช่น Count, Add และ Remove จึงรองรับการแก้ไขคอลเลกชันได้ด้วย

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

Stack ทำงานตามลำดับ Last-in First-out (LIF) ดังนั้นรายการที่ใหม่ที่สุดจะถูกนำออกก่อนโดยใช้ Pop ส่วน Queue ทำงานตามลำดับ First-in-first-out (FIFO) ดังนั้นรายการที่เก่าที่สุดจะถูกนำออกก่อนโดยใช้ Dequeue

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

ML.NET ป้อนข้อมูลสำหรับการฝึกอบรมผ่านคอลเลกชันต่างๆ เช่น List และ IEnumerable ซึ่งเชื่อมโยงกับไปป์ไลน์ IDataView ของมัน การจัดเก็บตัวอย่างในคอลเลกชันทั่วไปที่มีการกำหนดประเภทอย่างชัดเจนช่วยให้เวิร์กโฟลว์การเรียนรู้ของเครื่องมีความชัดเจนและปลอดภัยในด้านประเภทข้อมูล

สรุปโพสต์นี้ด้วย: