Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

เมธอด Queue.GetEnumerator() ใน C# : วนลูปเข้าถึงข้อมูลในคิว

เมธอด Queue.GetEnumerator() ใน C# ใช้คืนค่า Enumerator (IEnumerator) ที่ใช้สำหรับวนลูปเข้าถึงสมาชิกใน Queue ตามลำดับ FIFO (First-In-First-Out)

รูปแบบไวยากรณ์ (Syntax)

public virtual System.Collections.IEnumerator GetEnumerator();

ตัวอย่างที่ 1: เปรียบเทียบสองคิว

using System;
using System.Collections;

public class Demo
{
    public static void Main()
    {
        Queue queue = new Queue();
        queue.Enqueue(100);
        queue.Enqueue(200);
        queue.Enqueue(300);
        queue.Enqueue(400);
        
        Console.WriteLine("Queue1...");
        IEnumerator demoEnum = queue.GetEnumerator();
        while (demoEnum.MoveNext())
        {
            Console.WriteLine(demoEnum.Current);
        }
        
        Queue queue2 = new Queue();
        queue2.Enqueue(100);
        queue2.Enqueue(150);
        queue2.Enqueue(300);
        queue2.Enqueue(400);
        
        Console.WriteLine("\nQueue2...");
        demoEnum = queue2.GetEnumerator();
        while (demoEnum.MoveNext())
        {
            Console.WriteLine(demoEnum.Current);
        }
        
        // Equals เปรียบเทียบ reference ไม่ใช่เนื้อหา
        Console.WriteLine(queue.Equals(queue2)); // False
    }
}

ผลลัพธ์

Queue1...
100
200
300
400

Queue2...
100
150
300
400
False

ตัวอย่างที่ 2: คิวขนาดใหญ่

using System;
using System.Collections;

public class Demo
{
    public static void Main()
    {
        Queue queue = new Queue();
        
        for (int i = 1; i <= 10; i++)
        {
            queue.Enqueue(i * 100);
        }
        
        Console.WriteLine("Queue...");
        IEnumerator demoEnum = queue.GetEnumerator();
        while (demoEnum.MoveNext())
        {
            Console.WriteLine(demoEnum.Current);
        }
    }
}

ผลลัพธ์

Queue...
100
200
300
400
500
600
700
800
900
1000

สรุปและข้อแนะนำ

  • ใน C# สมัยใหม่ แนะนำใช้ Queue<T> (generic) แทน Queue (non-generic) เพื่อ type safety
  • สามารถใช้ foreach ได้โดยตรงกับ Queue (ซึ่งเรียก GetEnumerator() ให้อัตโนมัติ)
  • Equals() ของ Queue เปรียบเทียบ reference identity ไม่ใช่เนื้อหา
  • Enumerator เป็น read-only ไม่สามารถแก้ไข Queue ระหว่างการ enumerate ได้

รูปแบบแนะนำ (Modern C#)

using System;
using System.Collections.Generic;

public class Demo
{
    public static void Main()
    {
        Queue queue = new Queue();
        queue.Enqueue(100);
        queue.Enqueue(200);
        queue.Enqueue(300);
        
        // ใช้ foreach โดยตรง (สะดวกกว่า)
        foreach (int item in queue)
        {
            Console.WriteLine(item);
        }
    }
}