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.