C# C-Sharp คือ ตอนที่ 7 : คอลเลกชัน (Collections)และ Generics

  1. คอลเลกชัน (Collections)ใน C #
    1.1 อาร์เรย์ (Array)
    1.2 รายการ (List)
    1.3 Stack และ Queue
    1.4 HashSet
    1.5 พจนานุกรม (Dictionary)
  2. Generics ใน C #
    2.1 คลาสทั่วไป (Generic Classes)
    2.2 วิธีการทั่วไป (Generic Methods)
    2.3 ข้อจำกัด (Constraints) ใน Generics
  3. การนำไปใช้ในการทำแอพ

ในด้านการทำแอพ โดยเฉพาะอย่างยิ่งเมื่อใช้ภาษาอเนกประสงค์ เช่น C# การทำความเข้าใจคอลเล็กชัน (collections) และ generics เป็นสิ่งสำคัญ คอลเล็กชันใช้เพื่อเก็บกลุ่มของออบเจกต์ในหน่วยความจำ ในขณะที่ทั่วไปนำระดับความสามารถในการใช้ซ้ำและความปลอดภัยของประเภทมาสู่โค้ดของคุณ งานชิ้นนี้มุ่งเน้นไปที่การอธิบายความสำคัญ ฟังก์ชันการทำงาน และแอปพลิเคชันของคอลเลกชัน (collections) และ genericsใน C# สำหรับการทำแอพ

1. คอลเลกชัน (Collections)ใน C #

คอลเลกชันใน C# เป็นส่วนสำคัญของ .NET Framework ซึ่งมีหลายคลาสที่เก็บคอลเลกชันของวัตถุ คลาสเหล่านี้สามารถจัดกลุ่มเป็นรายการ พจนานุกรม คิว สแต็ก และชุด ขึ้นอยู่กับวิธีจัดการข้อมูล

1.1 อาร์เรย์ (Array)

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

int[] numbers = new int[5] {1, 2, 3, 4, 5};

1.2 รายการ (List)

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

List<int> numbers = new List<int> {1, 2, 3, 4, 5};

1.3 Stack และ Queue

Stacks and Queues มักใช้ในกรณีเฉพาะที่เราต้องการควบคุมลำดับขององค์ประกอบการประมวลผล สแต็คเป็นไปตามหลักการ LIFO (Last In, First Out) ทำให้เหมาะสำหรับสถานการณ์ที่คุณต้องการให้รายการสุดท้ายที่คุณใส่เป็นรายการแรกที่คุณนำออก

Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
stack.Push(3);
int lastIn = stack.Pop();  // lastIn = 3

ในทางกลับกัน คิวเป็นไปตามหลักการ FIFO (เข้าก่อนออกก่อน) ใช้เมื่อคุณต้องการจัดการออบเจกต์ตามลำดับการมาถึงของออบเจกต์ ซึ่งเป็นเรื่องปกติของคิวในโลกแห่งความเป็นจริง

Queue<int> queue = new Queue<int>();
queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);
int firstIn = queue.Dequeue();  // firstIn = 1

1.4 HashSet

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

HashSet<int> uniqueNumbers = new HashSet<int> {1, 2, 3, 2, 1};
// uniqueNumbers = {1, 2, 3}

1.5 พจนานุกรม (Dictionary)

พจนานุกรม (Dictionary) คือชุดของคู่คีย์-ค่า ซึ่งช่วยให้คุณเข้าถึงค่าได้ด้วยคีย์ที่เกี่ยวข้อง มันคล้ายกับพจนานุกรมจริง ๆ ซึ่งคุณสามารถค้นหาคำจำกัดความ (ค่า) ตามคำ (คีย์)

Dictionary<string, int> ages = new Dictionary<string, int>
{
    {"John", 35},
    {"Mary", 30},
    {"James", 40}
};
int johnAge = ages["John"];  // johnAge = 35

2. Generics ใน C #

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

การใช้ generics มากที่สุดใน C# อยู่ในคอลเล็กชันทั่วไปตามที่กล่าวไว้ข้างต้น แต่ละคอลเลกชันเหล่านี้ใช้พารามิเตอร์ประเภท (อยู่ในวงเล็บมุม) เพื่อระบุประเภทของรายการที่มีอยู่

List<int> numbers = new List<int>();

อย่างไรก็ตาม generics ไม่ได้จำกัดอยู่แค่คอลเลกชั่นเท่านั้น คุณยังสามารถกำหนดคลาส อินเทอร์เฟซ เมธอด เหตุการณ์ และผู้รับมอบสิทธิ์ทั่วไปของคุณ

2.1 คลาสทั่วไป (Generic Classes)

ในการทำแอพ คุณมักจะสร้างคลาสที่สามารถใช้กับข้อมูลประเภทต่างๆ ด้วย generics คุณสามารถสร้างคลาสดังกล่าวได้โดยไม่ต้องผูกมัดกับประเภทข้อมูลเฉพาะ

public class GenericClass<T>
{
    public T Data { get; set; }
}

var intInstance = new GenericClass<int>();
var stringInstance = new GenericClass<string>();

2.2 วิธีการทั่วไป (Generic Methods)

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

public T Max<T>(T num1, T num2) where T : IComparable<T>
{
    return num1.CompareTo(num2) > 0 ? num1 : num2;
}

2.3 ข้อจำกัด (Constraints) ใน Generics

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

public class GenericClass<T> where T : class
{
    // ...
}

ในตัวอย่างข้างต้น คลาสทั่วไปสามารถสร้างอินสแตนซ์ได้ด้วยประเภทที่เป็นคลาสเท่านั้น

3. การนำไปใช้ในการทำแอพ

การใช้คอลเลกชัน (collections) และ generics แพร่หลายในการทำแอพ C# มีประโยชน์อย่างยิ่งในการจัดการข้อมูล สร้างส่วนประกอบที่ใช้ซ้ำได้ ปรับปรุงประสิทธิภาพ และรับประกันความปลอดภัยของประเภท นี่คือแอปพลิเคชันเฉพาะบางอย่าง:

  1. การจัดการข้อมูล (Data Manipulation) : คอลเลกชันถูกใช้อย่างกว้างขวางในการจัดการและจัดการข้อมูล ตัวอย่างเช่น ในแอปมือถือ สามารถใช้รายการหรือพจนานุกรมเพื่อจัดการข้อมูลผู้ใช้ ในขณะที่คิวสามารถใช้เพื่อจัดการงานในบริการเบื้องหลัง
  2. ส่วนประกอบที่ใช้ซ้ำได้ (Reusable Components) : Generics ช่วยสร้างส่วนประกอบที่ใช้ซ้ำได้ ตัวอย่างเช่น ในแอปเกม สามารถสร้างคลาสทั่วไปเพื่อจัดการอ็อบเจกต์ในเกม โดยไม่คำนึงว่าสิ่งนั้นจะเป็นศัตรู ตัวเพิ่มพลัง หรือตัวละครของผู้เล่น
  3. ประสิทธิภาพ (Performance) : Generics สามารถนำไปสู่การปรับปรุงประสิทธิภาพโดยการลดความจำเป็นในการแกะกล่องและแกะกล่อง ซึ่งเป็นการดำเนินการทั่วไปในคอลเลกชันที่ไม่ใช่ทั่วไปที่สามารถเพิ่มค่าใช้จ่ายที่สำคัญได้
  4. ความปลอดภัยประเภท (Type Safety) : ทั้งคอลเลกชัน (collections) และทั่วไปให้ความปลอดภัยประเภท ทำให้แน่ใจว่าไม่มีการใช้วัตถุผิดประเภทโดยไม่ตั้งใจ ช่วยลดข้อผิดพลาดรันไทม์

การทำความเข้าใจคอลเล็กชัน (collections) และ generics ใน C# เป็นสิ่งสำคัญในการทำแอพ พวกเขามีวิธีที่มีประสิทธิภาพและยืดหยุ่นในการจัดกลุ่มและจัดการวัตถุ และช่วยสร้างโค้ดที่ปลอดภัยสำหรับประเภทที่ใช้ซ้ำได้ เมื่อคุณสำรวจและใช้คุณลักษณะเหล่านี้ต่อไป คุณจะพบว่าคุณลักษณะเหล่านี้เป็นเครื่องมือที่ทรงคุณค่าในชุดเครื่องมือการทำแอพ C# ของคุณ


C# C-Sharp คืออะไร

C# C-Sharp คือ ตอนที่ 6 : การเขียนโปรแกรมเชิงวัตถุ (OOP)
C# C-Sharp คือ ตอนที่ 8 : ไฟล์ I/O และการทำให้เป็นอนุกรม (Serialization)