Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Phương thức Queue.GetEnumerator() trong C#

Phương thức Queue.GetEnumerator() trong C# được dùng để trả về một enumerator (bộ liệt kê) cho phép lặp qua các phần tử của Queue theo thứ tự FIFO (First-In-First-Out).

Cú pháp

public virtual System.Collections.IEnumerator GetEnumerator();

Ví dụ 1: So sánh hai Queue với GetEnumerator

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);
        }

        // So sánh hai Queue (Equals so sánh tham chiếu, không phải nội dung)
        Console.WriteLine(queue.Equals(queue2)); // False
    }
}

Kết quả

Queue1...
100
200
300
400

Queue2...
100
150
300
400
False

Ví dụ 2: Queue lớn hơn

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);
        }
    }
}

Kết quả

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

Sử dụng foreach (khuyên dùng)

C# hỗ trợ foreach trực tiếp trên Queue (triển khai IEnumerable):

Queue queue = new Queue();
queue.Enqueue("A");
queue.Enqueue("B");
queue.Enqueue("C");

foreach (var item in queue)
{
    Console.WriteLine(item);
}
// A
// B
// C

Đặc điểm của Enumerator

  • Enumerator không cho phép sửa đổi collection khi đang duyệt (ném InvalidOperationException).
  • Chỉ đọc, chỉ tiến về phía trước (không có Reset/Previous).
  • Queue generic Queue<T> trả về IEnumerator<T> an toàn kiểu.

Queue non-generic vs generic

Đặc điểm Queue (non-generic) Queue<T> (generic)
Namespace System.Collections System.Collections.Generic
Kiểu phần tử object T (an toàn kiểu)
GetEnumerator() IEnumerator IEnumerator<T>
Hiệu suất Boxing/unboxing cho value type Không boxing, nhanh hơn

Lưu ý

  • Equals() trên Queue so sánh tham chiếu (reference equality), không so sánh nội dung.
  • Để so sánh nội dung, dùng LINQ: queue1.SequenceEqual(queue2).
  • Enumerator trở nên invalid nếu Queue bị sửa đổi (Enqueue/Dequeue/Clear) sau khi tạo enumerator.