Collections

5 November 2016

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

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

Collection เป็นคลาสที่มีการเก็บข้อมูลแบบ Generic มันสามารถเก็บข้อมูลได้ทุกประเภททั้ง Primitive type หรือ Reference type โดยในภาษา Visual Basic จะมี Collection หลายแบบสำหรับจัดการข้อมูลที่แตกต่างกัน ในบทนี้เราจะพูดถึง 4 แบบที่สำคัญ

  • List - คือประเภทข้อมูลที่เก็บแบบลำดับเหมือนอาเรย์
  • Stack - คือประเภทข้อมูลที่เก็บแบบสแต็ก
  • Queue - คือประเภทข้อมูลที่เก็บแบบแถวลำดับ
  • Dictionary - คือประเภทข้อมูลที่เก็บข้อมูลแบบ Map คือโดยมี Key และ Value

การใช้งาน List

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

Module ListExample

    Sub DisplayList(ByVal fruits As List(Of String))
        For Each fr As String In fruits
            Console.Write(fr & " ")
        Next
        Console.WriteLine()
    End Sub

    Sub Main()

        Dim fruits As List(Of String) = New List(Of String)()
        fruits.Add("Apple")
        fruits.Add("Orange")
        fruits.Add("Banana")
        fruits.Add("Lemon")

        DisplayList(fruits)

        fruits.Add("Grape")
        Console.WriteLine("{0} items in the list.", fruits.Count)

        If fruits.Contains("Grape") Then
            Console.WriteLine("Grape is in the list.")
        End If

        fruits.Remove("Banana")
        Console.WriteLine("{0} items in the list.", fruits.Count)

        DisplayList(fruits)

        Console.WriteLine("Item at index 2 = {0}", fruits.ElementAt(2))

        fruits.Reverse()

        DisplayList(fruits)

        fruits.Clear()

        If fruits.Count = 0 Then
            Console.WriteLine("List is empty.")
        End If

    End Sub

End Module

นี่เป็นตัวอย่างของการใช้ List ในภาษา Visual Basic ซึ่งเราได้สร้างตัวแปร List สำหรับเก็บชื่อของผลไม้ที่เป็น String

Dim fruits As List(Of String) = New List(Of String)()

นี่เป็นคำสั่งในการประกาศลิสต์ เราได้ประกาศลิสต์สำหรับเก็บข้อมูลที่เป็นแบบ String โดยการกำหนดในคำสั่ง Of String

fruits.Add("Apple")
fruits.Add("Orange")
fruits.Add("Banana")
fruits.Add("Lemon")

เราใช้เมธอด Add() ในการเพิ่มข้อมูลลงไปในลิสต์ โดยข้อมูลจะถูกเพิ่มไปยังตำแหน่งสุดท้ายของลิสต์ และเราได้เพิ่มผลไม้ 4 ชื่อเข้าไปยังลิสต์

DisplayList(fruits)

เราสร้างเมธอด DisplayList() สำหรับแสดงข้อมูลภายในลิสต์ โดยการวนคำสั่ง For each ในการวนอ่านค่า

fruits.Add("Grape")
Console.WriteLine("{0} items in the list.", fruits.Count)

If fruits.Contains("Grape") Then
    Console.WriteLine("Grape is in the list.")
End If

ต่อมาเราเพิ่มข้อมูลใหม่ "Grape" เข้าไปยังลิสต์ และใช้ Property fruits.Count สำหรับการนับจำนวนสมาชิกทั้งหมดภายในลิสต์ และใช้เมธอด Contains() ในการตรวจสอบว่ามีออบเจ็คที่ระบุอยู่ในลิสต์หรือไม่

fruits.Remove("Banana")
Console.WriteLine("{0} items in the list.", fruits.Count)

เราใช้เมธอด Remove() สำหรับนำข้อมูลที่ระบบออกจากลิสต์ และนับข้อมูลในลิสต์อีกครั้ง ผลลัพธ์ของเมธอดนี้จะทำให้ข้อมูลข้างหลังถูกเลื่อน Index ลงมา 1 ตำแหน่ง คุณสามารถลบข้อมูลจาก index ที่ระบุได้โดยการใช้เมธอด RemoveAt(index)

Console.WriteLine("Item at index 2 = {0}", fruits.ElementAt(2))

ต่อมาเราเขาถึงข้อมูลในลิสต์จาก index ของมันด้วยเมธอด ElementAt()

fruits.Reverse()

DisplayList(fruits)

fruits.Clear()

เมธอด Reverse() ใช้สำหรับกลับลำดับของข้อมูลภายในลิสต์ และเมธอด Clear() เป็นการลบข้อมูลทั้งหมดออกจากลิสต์

Apple Orange Banana Lemon
5 items in the list.
Grape is in the list.
4 items in the list.
Apple Orange Lemon Grape
Item at index 2 = Lemon
Grape Lemon Orange Apple
List is empty.

นี่เป็นผลลัพธ์ของโปรแกรมในการทำงานของ List

การใช้งาน Stack

**Stack **คือประเภทข้อมูลที่มีการทำงานในรูปแบบ LIFO (Last In First Out) หรือข้อมูลที่ใส่เข้าไปทีหลังจะออกมาก่อน ยกตัวอย่างเช่น เมื่อคุณวางจานซ้อนกันโดยจานที่วางใหม่จะใส่ไว้ด้านบน (push) ในขณะเดียวกันคุณสามารถนำแค่จานบนสุดออกจากกองได้เท่านั้น (pop)

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

Module StackExample

    Sub DisplayStack(ByVal fruits As Stack(Of Integer))
        For Each fr As String In fruits
            Console.Write(fr & " ")
        Next
        Console.WriteLine()
    End Sub

    Sub Main()

        Dim numbers As Stack(Of Integer) = New Stack(Of Integer)()
        numbers.Push(1)
        numbers.Push(2)
        numbers.Push(5)
        DisplayStack(numbers)

        numbers.Push(8)
        DisplayStack(numbers)

        Console.WriteLine("Pop number {0} from stack", numbers.Pop())
        DisplayStack(numbers)

        Console.WriteLine("Pop number {0} from stack", numbers.Pop())
        DisplayStack(numbers)

        Console.WriteLine("{0} items in stack", numbers.Count)
        Console.WriteLine("Sum = {0}", numbers.Sum())

    End Sub

End Module

นี่เป็นตัวอย่างของการใช้งาน Stack ในภาษา Visual Basic ในตัวอย่างเราเขียนโปรแกรมใช้ Stack ในการเก็บตัวเลขจำนวนเต็ม

Dim numbers As Stack(Of Integer) = New Stack(Of Integer)()

นี่เป็นการประกาศตัวแปร Stack สำหรับในการเก็บข้อมูลแบบ Integer

numbers.Push(1)
numbers.Push(2)
numbers.Push(5)
DisplayStack(numbers)

เราได้เพิ่มข้อมูลลงใน Stack ด้วยเมธอด Push() ข้อมูลที่ถูกเพิ่มจะอยู่บนสุดของ Stack เราใช้เมธอด DisplayStack() ที่เราสร้างขึ้นสำหรับแสดงข้อมูลใน Stack ข้อมูลในตำแหน่งแรกของ Stack จะเป็นข้อมูลที่ถูกเพิ่มเข้าไปล่าสุดเสมอ

Console.WriteLine("Poped number {0} from stack", numbers.Pop())
 DisplayStack(numbers)

เมธอด Pop() เป็นเมธอดสำหรับนำข้อมูลออกจาก Stack และเมธอดจะส่งค่าในตำแหน่งแรกหรือข้อมูลที่ถูกเพิ่มเข้าไปล่าสุดออกมา

ดังนั้นเมธอดที่สำคัญสำหรับ Stack ก็จะมีสองเมธอดคือ Push() และ Pop() อย่างไรก็ตาม Collection ทุกประเภทสามารถใช้เมธอดบางอย่างเหมือนกันได้ เพราะมัน implement มาจาก interface เดียวกัน เช่น property Count หรือฟังก์ชัน Sum() สำหรับหาผลรวมของ Collection แบบตัวเลข

5 2 1
8 5 2 1
Pop number 8 from stack
5 2 1
Pop number 5 from stack
2 1
2 items in stack
Sum = 3

นี่เป็นผลลัพธ์ในการทำงานของโปรแกรมในการใช้ Stack

การใช้งาน Queue

Queue คือประเภทข้อมูลที่เก็บแบบ FIFO (First in first out) ข้อมูลที่ใส่เข้าไปใน Queue ก่อนจะนำออกได้ก่อน เช่น คุณกำลังต่อแถวซื้ออาหาร คนที่อยู่ข้างหน้าสุดจะได้รับบริการก่อน และคนที่มาทีหลังจะต้องต่อแถวอยู่ท้ายสุด

Module QueueExample

    Sub DisplayQueue(ByVal queue As Queue(Of String))
        For Each item As String In queue
            Console.Write(item & " ")
        Next
        Console.WriteLine()
    End Sub

    Sub Main()

        Dim names As Queue(Of String) = New Queue(Of String)()
        names.Enqueue("Mateo")
        names.Enqueue("Thomas")
        names.Enqueue("Danny")
        names.Enqueue("James")
        DisplayQueue(names)

        Console.WriteLine("Dequeue: {0}", names.Dequeue())
        DisplayQueue(names)

        names.Enqueue("Rob")
        names.Enqueue("William")

        DisplayQueue(names)

        Console.WriteLine("Dequeue: {0}", names.Dequeue())
        Console.WriteLine("Dequeue: {0}", names.Dequeue())
        DisplayQueue(names)

        Console.WriteLine("{0} people left in the queue.", names.Count)

    End Sub

End Module

นี่เป็นตัวอย่างของการทำของ Queue ในการต่อแถว เรามี Queue ที่เป็น String สำหรับเก็บชื่อของผู้ที่จะมาเข้าแถว

Dim names As Queue(Of String) = New Queue(Of String)()

เราสร้าง Queue สำหรับเก็บข้อมูลแบบ String สำหรับในการเก็บชื่อ

names.Enqueue("Mateo")
names.Enqueue("Thomas")
names.Enqueue("Danny")
names.Enqueue("James")

ในการเพิ่มข้อมูลเข้าไปยัง Queue เราใช้เมธอด Enqueue() โดยข้อมูลจะเพิ่มไปยังตำแหน่งสุดท้ายของ Queue

Console.WriteLine("Dequeue: {0}", names.Dequeue())

เมธอด Dequeue() ใช้สำหรับนำข้อมูลในตำแรกออกจาก Queue เราใช้เมธอด DisplayQueue() ที่เราสร้างขึ้นสำหรับแสดงข้อมูลภายใน Queue

Mateo Thomas Danny James
Dequeue: Mateo
Thomas Danny James
Thomas Danny James Rob William
Dequeue: Thomas
Dequeue: Danny
James Rob William
3 people left in the queue.

นี่เป็นผลลัพธ์ในการทำงานของโปรแกรมการใช้ Queue ในภาษา Visual Basic

การใช้งาน Dictionary

Dictionary คือการเก็บข้อมูลแบบ Map ข้อมูลที่มีการเก็บในรูปแบบ Key และ Value โดย Key นั้นจะเป็นสิ่งที่ไม่ซ้ำกัน ซึ่งในอาเรย์ปกติ Key นั้นจะเก็บเป็น Integer แต่สำหรับใน Dictionary คุณสามารถกำหนด Key เป็นข้อมูลประเภทใดๆ มาดูตัวอย่างการใช้งาน Dictionary ในภาษา Visual Basic

Module DictionaryExample

    Sub Main()

        Dim countries As Dictionary(Of String, String) =
            New Dictionary(Of String, String)()

        countries("us") = "United State"
        countries("jp") = "Japan"
        countries("th") = "Thailand"
        countries("uk") = "Ukrain"

        If countries.ContainsKey("th") Then
            Console.WriteLine("Key ""th"" is exist")
        End If

        countries("th") = "THAILAND"

        Dim item As KeyValuePair(Of String, String)
        For Each item In countries
            Console.WriteLine("{0}, {1}", item.Key, item.Value)
        Next

    End Sub

End Module

นี่เป็นตัวอย่างของการใช้ Dictionary ในการเก็บชื่อของประเทศ โดยเราใช้ตัวอักษรย่อเป็น Key ของ Dictionary นี้

Dim countries As Dictionary(Of String, String) =
        New Dictionary(Of String, String)()

นี่เป็นคำสั่งในการสร้าง Dictionary ซึ่งมันจะแตกต่างจากประเภทอื่นเล็กน้อย โดยเราต้องกำหนดประเภทของ Key และ Value ลงไปในคอนสตรัคเตอร์

countries("us") = "United State"
countries("jp") = "Japan"
countries("th") = "Thailand"
countries("uk") = "Ukrain"

ในคำสั่งด้านบน คุณสามารถกำหนดค่าให้กับ Dictionary และการอ่านข้อมูล จาก Key ของมันได้โดยตรง เราได้เพิ่ม 4 ข้อมูลลงไปใน Dictionary โดย Key ของมัน

If countries.ContainsKey("th") Then
    Console.WriteLine("Key ""th"" is exist")
End If

เมธอด ContainsKey() ใช้สำหรับตรวจสอบว่ามี Key อยู่ใน Dictionary หรือไม่ และคุณสามารถใช้เมธอด ContainsValue() สำหรับตรวจสอบค่า Value ได้เช่นเดียวกัน

Dim item As KeyValuePair(Of String, String)
For Each item In countries
    Console.WriteLine("{0}, {1}", item.Key, item.Value)
Next

ในการอ่านค่าจาก Dictionary ด้วยคำสั่ง For each เราได้สร้าง Iterator ออบเจ็คจากคลาส KeyValuePair และเข้าถึง Key และ Value จาก Property item.Key และ item.Value ตามลำดับ

Key "th" is exist
us, United State
jp, Japan
th, THAILAND
uk, Ukrain

นี่เป็นผลลัพธ์ในการทำงานของการใช้ Dictionary ในภาษา Visual Basic

References

จาก Collection ประเภทต่างๆ ที่เราได้พูดมาแล้วเป็นแค่ส่วนหนึ่งเท่านั้น สำหรับ Collection ทั้งหมดในภาษา Visual Basic คุณสามารถดูได้ที่ https://msdn.microsoft.com/en-us/library/system.collections.generic(v=vs.110).aspx

ในบทนี้คุณได้เรียนรู้การใช้งาน Collection เบื้องต้นในภาษา Visual Basic

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