Generic Collections

11 February 2016

ในบทนี้ คุณจะได้รู้จักกับ Collections ในภาษา C# และการใช้งาน Collections ประเภทต่างๆ ที่มีความจำเป็นในสภานะการณ์ที่แตกต่างกัน

Collections (คอลเล็กชัน) หรือ Generic Collections นั้นเป็นไลบรารี่ของภาษา C# ที่มีอยู่แล้ว ซึ่งเราสามารถที่จะนำมาใช้งานได้เลย โดยมันจะอยู่ภายใน Namespace System.Collections.Generic อย่างไรก็ตาม เราจะพูดถึงเฉพาะ Collection ที่มีการใช้บ่อยๆ ที่สุดเท่านั้น โดยรูปแบบการใช้งาน Generic Collections จะเป็นดังนี้

Type<Data_type> collection_name = new Type<Data_type>();

การใช้ List

List (ลิสต์) นั้นเป็นโครงสร้างข้อมูลที่ใช้ในการเก็บข้อมูลแบบเป็นลำดับ โดยมันมาแทน ArrayList ที่ถูกเลิกใช้ไปตั้งแต่ .Net Framework 2.0 สิ่งแตกต่างของมันกับอาเรย์คือ มันสามารถเก็บข้อมูลได้แบบไดนามิกส์ หรือเพิ่มขึ้นเรื่อยๆ โดยที่เราไม่ต้องบอกขนาดล่วงหน้า และเช่นเดียวกัน Collections ทกตัวนั้นเป็นไดนามิกส์ทั้งหมด

ต่อไปมาดูตัวอย่างการใช้ List ในภาษา C#

using System;
using System.Collections.Generic;

namespace CollectionsExample
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> number = new List<int>();

            number.Add(1);
            number.Add(3);
            number.Add(5);
            number.Add(7);
            number.Add(9);

            for (int i = 0; i < number.Count; i++) {
                int n = number.ElementAt<int>(i);
                Console.Write("{0}, ", n);
            }
        }
    }
}

จากตัวอย่าง เราได้สร้าง List ขึ้นมาโดยลิสต์นี้จะใช้เก็บข้อมูลประเภท Integer โดยลิสต์ของเรานั้นจะมีขนาดเป็นแบบไดนามิกส์

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

คุณสามารถเพิ่มข้อมูลเข้าไปในลิสต์ได้ไม่จำกัด โดยใช้เมธอด Add() และพารามิเตอร์นั้นเป็นข้อมูลชนิด Integer ที่คุณได้ประกาศไว้ในตอนแรก ในตัวอย่างเราได้เพิ่มเข้าไป 5 หมายเลข

        number.Add(1);
        number.Add(3);
        number.Add(5);
        number.Add(7);
        number.Add(9);

ต่อมาเป็นการแสดงผลข้อมูลในลิส โดยCount; นั้นเป็นตัวแปรที่ใช้สำหรับรับค่าขนาดของลิสต์มา และเมธอด ElementAt<int>() สำหรับการนำข้อมูลออกจาก List โดยมีพารามิเตอร์เป็น index ของมัน

            for (int i = 0; i < number.Count; i++) {
                int n = number.ElementAt<int>(i);
                Console.Write("{0}, ", n);
            }

ข้างล่างนี้ผมเป็นรันของโปรแกรม ที่แสดงข้อมูลทั้งหมดภายใน List โดยการใช้คำสั่ง for loop ในการแสดงผล

1, 3, 5, 7, 9,

การใช้ Dictionary

Dictionary เป็น Generic ชนิดหนึ่งในภาษา C# ที่เก็บข้อมูลเป็นแบบคูอันดับของ Key และ Value นั่นหมายความว่ามันใช้ Key เป็น index เพื่อนำข้อมูลมาใช้ มันมักจะถูกนำมาใช้ในงานกรณีที่ Key นั้นเป็นข้อมูลชนิดอื่นๆ เช่น String ซึ่งมันรวดเร็วและสะดวก

มาดูตัวอย่างการใช้งาน Dictionary ในภาษา C#

using System;
using System.Collections.Generic;

namespace CollectionExample2
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, string> country = new Dictionary<string, string>();

            country.Add("us", "United State");
            country.Add("uk", "Ukrain");
            country.Add("be", "Belgium");
            country.Add("gr", "Greece");

            // Get key and value from  KeyValuePair object
            foreach (KeyValuePair<string, string> cnt in country)
            {
                Console.WriteLine("Key = {0}, Value = {1}", cnt.Key, cnt.Value);
            }

            // Direct access the value via key
            country["gr"] = "GREECE";
            Console.WriteLine("\nuk = " + country["uk"]);
            Console.WriteLine("gr = " + country["gr"]);

            // Remove string object via key
            country.Remove("us");

            if (!country.ContainsKey("us"))
            {
                Console.WriteLine("\nKey \"us\" is not found.");
            }

            Console.WriteLine("\nCount = " + country.Count);
        }
    }
}

จากตัวอย่างข้างบน เราได้สร้าง Dictionary ชื่อมีชื่อว่า country โดยมี Key และ Value เป็น string เพื่อสำหรับเก็บข้อมูลตัวย่อและชื่อของประเทศนั้นๆ ด้วยคำสั่ง

Dictionary<string, string> country = new Dictionary<string, string>();

หลังจากนั้นเราใช้ฟังก์ชัน Add(para1, para2) ในการเพิ่มข้อมูล โดยมันจะมีพารามิเตอร์ของตัวคือ Key และ Value ของมัน ซึ่งแตกต่างจาก Generic แบบ List เล็กน้อย และเราได้ใช้ foreach ในการวนอ่านค่าจาก Dictionary โดยอ่านมาเก็บไว้ในออบเจ็บ KeyValuePair ที่ชื่อ cnt และเราสามารถเข้าถึง Key ได้โดย cnt.Key และสำหรับ Value โดย cnt.Value และแสดงผลมันออกมาทางหน้าจอ

            foreach (KeyValuePair<string, string> cnt in country)
            {
                Console.WriteLine("Key = {0}, Value = {1}", cnt.Key, cnt.Value);
            }

ต่อไปเป็นการเข้าถึงข้อมูลโดย Key โดยจะเข้าโดยชื่อตัวแปรและวงเล็บ [] จากตัวอย่างเราได้เปลี่ยนค่าให้กับสมาชิกที่มี Key เป็น gr ให้เป็นตัวพิมพ์ใหญ่ และแสดงผลมันออกมา

            country["gr"] = "GREECE";
            Console.WriteLine("\nuk = " + country["uk"]);
            Console.WriteLine("gr = " + country["gr"]);

ต่อไปเราได้ใช้เมธอด Remove() เพื่อลบ Key "us" ออกจาก Dictionary โดยใส่ Key ที่ต้องการลบเป็นพารามิเตอร์ และเราใช้เมธอด ContainsKey() เพื่อตรวจสอบว่ามี Key นี้อยู่หรือไม่ ถ้าไม่มีจะแสดงผลว่า ไม่พบ Key

เนื่องจากมันเป็น Generic ที่ Implement มาจากคลาสเดียวกันคุณสามารถใช้ตัวแปร Count เพื่อดูจำนวนใน Generic ชนิดต่างๆ ได้เสมอ และนี่เป็นผลลัพธ์เมื่อรันโปรแกรม

Key = us, Value = United State
Key = uk, Value = Ukrain
Key = be, Value = Belgium
Key = gr, Value = Greece

uk = Ukrain
gr = GREECE

Key "us" is not found.

Count = 3

มันยังมีเมธอดต่างๆ อีกมากมายที่คุณสามารถใช้ได้สำหรับ Generic แต่ละชนิดคุณสามารถตรวจสอบได้โดย Intellisense (code suggestion) ของโปรแกรม

Generic class ประเภทอื่นๆ

ในภาษา C# ยังมี Generic Collection แบบอื่นๆ อีกที่คุณสามารภใช้ได้ ตามรูปแบบของโปรแกรมของคุณ เช่น Stack เป็นออบเจ็คข้อมูลแบบสมาชิกที่เข้าทีหลังจะออกมาก่อน หรือ Queue สมาชิกที่เข้าก่อนจะออกจาก เป็นต้น

ในบทนี้คุณได้รู้จักกับ Generic พื้นฐานในภาษา C# และการใช้งานแบบต่างๆ และคุณสามารถดู Generic ทั้งหมดได้ที่นี่ https://msdn.microsoft.com/en-us/library/system.collections.generic(v=vs.110).aspx

บทความนี้เป็นประโยชน์หรือไม่?Yes·No