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

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

Giới thiệu

Phương thức Queue.Dequeue() trong C# xóa và trả về đối tượng ở đầu (beginning) của Queue. Queue tuân theo nguyên tắc FIFO (First In, First Out).

Cú pháp

public virtual object Dequeue ();

Ví dụ 1: Dequeue cơ bản với Queue<string>

using System;
using System.Collections.Generic;

public class Demo {
    public static void Main() {
        Queue queue = new Queue();
        queue.Enqueue("A");
        queue.Enqueue("B");
        queue.Enqueue("C");
        queue.Enqueue("D");
        queue.Enqueue("E");
        queue.Enqueue("F");
        queue.Enqueue("G");

        Console.WriteLine("Số lượng phần tử = " + queue.Count);
        Console.WriteLine("Phần tử ở đầu queue = " + queue.Peek());

        queue.Dequeue(); // Xóa A
        queue.Dequeue(); // Xóa B
        queue.Dequeue(); // Xóa C

        Console.WriteLine("Số lượng phần tử (sau 3 Dequeue) = " + queue.Count);
    }
}

Đầu ra ví dụ 1

Số lượng phần tử = 7
Phần tử ở đầu queue = A
Số lượng phần tử (sau 3 Dequeue) = 4

Ví dụ 2: Dequeue với Clear và duyệt queue

using System;
using System.Collections.Generic;

public class Demo {
    public static void Main() {
        Queue queue = new Queue();
        queue.Enqueue("Gary");
        queue.Enqueue("Jack");
        queue.Enqueue("Ryan");
        queue.Enqueue("Kevin");
        queue.Enqueue("Mark");
        queue.Enqueue("Jack");
        queue.Enqueue("Ryan");
        queue.Enqueue("Kevin");

        Console.Write("Số lượng phần tử = ");
        Console.WriteLine(queue.Count);

        Console.WriteLine("Queue...");
        foreach(string item in queue) {
            Console.WriteLine(item);
        }

        queue.Dequeue(); // Xóa Gary
        queue.Dequeue(); // Xóa Jack

        Console.WriteLine("\nQueue...ĐÃ CẬP NHẬT");
        foreach(string item in queue) {
            Console.WriteLine(item);
        }

        Console.Write("Số lượng phần tử (đã cập nhật) = " + queue.Count);

        queue.Clear();
        Console.Write("\nSố lượng phần tử (sau Clear) = ");
        Console.WriteLine(queue.Count);
    }
}

Đầu ra ví dụ 2

Số lượng phần tử = 8
Queue...
Gary
Jack
Ryan
Kevin
Mark
Jack
Ryan
Kevin

Queue...ĐÃ CẬP NHẬT
Ryan
Kevin
Mark
Jack
Ryan
Kevin
Số lượng phần tử (đã cập nhật) = 6
Số lượng phần tử (sau Clear) = 0

Lưu ý quan trọng

  • Nếu Queue rỗng, Dequeue() ném InvalidOperationException. Luôn kiểm tra Count > 0 trước.
  • Dequeue() trả về object (non-generic) hoặc T (generic Queue<T>).
  • Khác với Peek() chỉ xem, Dequeue() xóa phần tử khỏi queue.
  • Độ phức tạp thời gian: O(1) amortized.

So sánh Peek vs Dequeue vs Enqueue

Phương thứcMô tảThay đổi CountTrả về
Enqueue(item)Thêm item vào cuối+1void
Peek()Xem item ở đầu0item
Dequeue()Lấy và xóa item ở đầu-1item

Ứng dụng thực tế

  • Xử lý tác vụ theo thứ tự đến (task scheduling, message queue).
  • Thuật toán BFS (Breadth-First Search) duyệt đồ thị/cây.
  • Buffer luồng dữ liệu (stream buffering, producer-consumer).
  • Rate limiting, request throttling.
  • Trong .NET hiện đại, ưu tiên Queue<T> generic hoặc ConcurrentQueue<T> cho thread-safe.

Queue non-generic vs generic

  • System.Collections.Queue: lưu object, boxing/unboxing cho value type.
  • System.Collections.Generic.Queue<T>: type-safe, hiệu năng tốt hơn, khuyến nghị dùng.