跳過到頁腳內容
.NET幫助

C# 隊列(開發者的工作原理)

1.簡介

在程式設計領域中,有效率的資料處理是軟體開發成功的基石。 在管理和組織資訊方面扮演重要角色的一種基本資料結構是佇列。 C# 是一種功能強大且多樣化的程式語言,在 C# 的背景下,C# Queue 成為順序管理資料的基本工具。 若要進一步瞭解 C# 中的佇列,以下是推薦的文章:C# 中的佇列.NET 中的一般佇列類

佇列遵循先入先出 (FIFO) 原則,即先加入的元素會先被移除。 此特性使其在需要以特定順序處理資料或物件的情境中特別有用,例如以系統化的方式處理任務或管理網頁伺服器中的請求。

在本文中,我們將使用 C# PDF Library IronPDF 與 C# Queue。

2.C# Queue 的類型和用途

2.1.標準佇列

C# 中的標準佇列是一個通用類別,可讓開發人員建立任何資料類型的佇列。 它提供了像 Enqueue 這樣的方法,用來將元素加入到佇列的末端,以及 Dequeue 這樣的方法,用來將元素從前端移除。 這種類型的佇列廣泛應用於資料處理遵循嚴格順序的場景,以確保資源分配的公平性。

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    { 
        // Create an empty queue
        Queue<int> standardQueue = new Queue<int>();

        // Enqueue elements into the queue
        standardQueue.Enqueue(10);
        standardQueue.Enqueue(20);
        standardQueue.Enqueue(30);

        // Dequeue elements from the queue until it is empty
        while (standardQueue.Count > 0)
        {
            int element = standardQueue.Dequeue();
            Console.WriteLine($"Dequeued: {element}");
        }
    }
}
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    { 
        // Create an empty queue
        Queue<int> standardQueue = new Queue<int>();

        // Enqueue elements into the queue
        standardQueue.Enqueue(10);
        standardQueue.Enqueue(20);
        standardQueue.Enqueue(30);

        // Dequeue elements from the queue until it is empty
        while (standardQueue.Count > 0)
        {
            int element = standardQueue.Dequeue();
            Console.WriteLine($"Dequeued: {element}");
        }
    }
}
Imports System
Imports System.Collections.Generic

Friend Class Program
	Shared Sub Main()
		' Create an empty queue
		Dim standardQueue As New Queue(Of Integer)()

		' Enqueue elements into the queue
		standardQueue.Enqueue(10)
		standardQueue.Enqueue(20)
		standardQueue.Enqueue(30)

		' Dequeue elements from the queue until it is empty
		Do While standardQueue.Count > 0
			Dim element As Integer = standardQueue.Dequeue()
			Console.WriteLine($"Dequeued: {element}")
		Loop
	End Sub
End Class
$vbLabelText   $csharpLabel

輸出

C# Queue (How it Works For Developers):圖 1 - OUTPUT:標準佇列

2.2.優先順序佇列

在某些情況下,排定佇列中元素的優先順序變得至關重要。 C# 沒有內建優先順序佇列,但開發人員可以使用排序集合或自訂資料結構來實作優先順序佇列。 當某些元素需要根據特定標準(如緊急性或重要性)先於其他元素處理時,此類型的佇列將非常有利。

using System;
using System.Collections.Generic;

class Program
{    
    static void Main()
    {
        // Create a priority queue using a sorted set to store elements in order
        SortedSet<int> priorityQueue = new SortedSet<int>();

        // Add elements to the priority queue
        priorityQueue.Add(30);
        priorityQueue.Add(10);
        priorityQueue.Add(20);

        // Dequeue elements from the priority queue based on their priority
        while (priorityQueue.Count > 0)
        {
            // Access the minimum element (highest priority for this example)
            int element = priorityQueue.Min;
            // Remove the element from the queue
            priorityQueue.Remove(element);
            Console.WriteLine($"Priority Queue Dequeued: {element}");
        }
    }
}
using System;
using System.Collections.Generic;

class Program
{    
    static void Main()
    {
        // Create a priority queue using a sorted set to store elements in order
        SortedSet<int> priorityQueue = new SortedSet<int>();

        // Add elements to the priority queue
        priorityQueue.Add(30);
        priorityQueue.Add(10);
        priorityQueue.Add(20);

        // Dequeue elements from the priority queue based on their priority
        while (priorityQueue.Count > 0)
        {
            // Access the minimum element (highest priority for this example)
            int element = priorityQueue.Min;
            // Remove the element from the queue
            priorityQueue.Remove(element);
            Console.WriteLine($"Priority Queue Dequeued: {element}");
        }
    }
}
Imports System
Imports System.Collections.Generic

Friend Class Program
	Shared Sub Main()
		' Create a priority queue using a sorted set to store elements in order
		Dim priorityQueue As New SortedSet(Of Integer)()

		' Add elements to the priority queue
		priorityQueue.Add(30)
		priorityQueue.Add(10)
		priorityQueue.Add(20)

		' Dequeue elements from the priority queue based on their priority
		Do While priorityQueue.Count > 0
			' Access the minimum element (highest priority for this example)
			Dim element As Integer = AddressOf priorityQueue.Min
			' Remove the element from the queue
			priorityQueue.Remove(element)
			Console.WriteLine($"Priority Queue Dequeued: {element}")
		Loop
	End Sub
End Class
$vbLabelText   $csharpLabel

C# Queue (How it Works For Developers):圖 2 - OUTPUT:優先順序佇列

2.3.圓形佇列

圓形佇列是一種變體,最後一個元素與第一個元素相連,形成圓形結構。 在佇列有固定大小,且舊佇列元素需要以循環方式被新元素取代的情況下,這可能會很有利。 在 C# 中實作迴圈佇列可以優化記憶體的使用,並確保資料處理的效率。

using System;

// CircularQueue class to implement a fixed-size circular queue
class CircularQueue
{
    private int[] array;
    private int front, rear, size;

    public CircularQueue(int size)
    {
        this.size = size;
        array = new int[size];
        front = rear = -1;
    }

    // Enqueue method to add an element to the circular queue
    public void Enqueue(int item)
    {
        if ((front == 0 && rear == size - 1) || (rear == (front - 1) % (size - 1)))
        {
            Console.WriteLine("Queue is full");
            return;
        }
        else if (front == -1)  // Initial insertion case
        {
            front = rear = 0;
            array[rear] = item;
        }
        else if (rear == size - 1 && front != 0)  // Wrap around
        {
            rear = 0;
            array[rear] = item;
        }
        else  // Normal case
        {
            rear++;
            array[rear] = item;
        }
    }

    // Dequeue method to remove an element from the circular queue
    public int Dequeue()
    {
        if (front == -1)  // Queue is empty case
        {
            Console.WriteLine("Queue is empty");
            return -1;
        }

        int item = array[front];
        array[front] = -1;

        if (front == rear)  // Single element case
            front = rear = -1;
        else if (front == size - 1)  // Wrap around
            front = 0;
        else  // Normal case
            front++;

        return item;
    }
}

class Program
{
    static void Main()
    {
        // Create a circular queue with a specified initial capacity
        CircularQueue circularQueue = new CircularQueue(5);

        // Enqueue elements
        circularQueue.Enqueue(10);
        circularQueue.Enqueue(20);
        circularQueue.Enqueue(30);

        // Dequeue elements
        Console.WriteLine($"Circular Queue Dequeued: {circularQueue.Dequeue()}");
        Console.WriteLine($"Circular Queue Dequeued: {circularQueue.Dequeue()}");
    }
}
using System;

// CircularQueue class to implement a fixed-size circular queue
class CircularQueue
{
    private int[] array;
    private int front, rear, size;

    public CircularQueue(int size)
    {
        this.size = size;
        array = new int[size];
        front = rear = -1;
    }

    // Enqueue method to add an element to the circular queue
    public void Enqueue(int item)
    {
        if ((front == 0 && rear == size - 1) || (rear == (front - 1) % (size - 1)))
        {
            Console.WriteLine("Queue is full");
            return;
        }
        else if (front == -1)  // Initial insertion case
        {
            front = rear = 0;
            array[rear] = item;
        }
        else if (rear == size - 1 && front != 0)  // Wrap around
        {
            rear = 0;
            array[rear] = item;
        }
        else  // Normal case
        {
            rear++;
            array[rear] = item;
        }
    }

    // Dequeue method to remove an element from the circular queue
    public int Dequeue()
    {
        if (front == -1)  // Queue is empty case
        {
            Console.WriteLine("Queue is empty");
            return -1;
        }

        int item = array[front];
        array[front] = -1;

        if (front == rear)  // Single element case
            front = rear = -1;
        else if (front == size - 1)  // Wrap around
            front = 0;
        else  // Normal case
            front++;

        return item;
    }
}

class Program
{
    static void Main()
    {
        // Create a circular queue with a specified initial capacity
        CircularQueue circularQueue = new CircularQueue(5);

        // Enqueue elements
        circularQueue.Enqueue(10);
        circularQueue.Enqueue(20);
        circularQueue.Enqueue(30);

        // Dequeue elements
        Console.WriteLine($"Circular Queue Dequeued: {circularQueue.Dequeue()}");
        Console.WriteLine($"Circular Queue Dequeued: {circularQueue.Dequeue()}");
    }
}
Imports System

' CircularQueue class to implement a fixed-size circular queue
Friend Class CircularQueue
	Private array() As Integer
	Private front, rear, size As Integer

	Public Sub New(ByVal size As Integer)
		Me.size = size
		array = New Integer(size - 1){}
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: front = rear = -1;
		rear = -1
		front = rear
	End Sub

	' Enqueue method to add an element to the circular queue
	Public Sub Enqueue(ByVal item As Integer)
		If (front = 0 AndAlso rear = size - 1) OrElse (rear = (front - 1) Mod (size - 1)) Then
			Console.WriteLine("Queue is full")
			Return
		ElseIf front = -1 Then ' Initial insertion case
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: front = rear = 0;
			rear = 0
			front = rear
			array(rear) = item
		ElseIf rear = size - 1 AndAlso front <> 0 Then ' Wrap around
			rear = 0
			array(rear) = item
		Else ' Normal case
			rear += 1
			array(rear) = item
		End If
	End Sub

	' Dequeue method to remove an element from the circular queue
	Public Function Dequeue() As Integer
		If front = -1 Then ' Queue is empty case
			Console.WriteLine("Queue is empty")
			Return -1
		End If

		Dim item As Integer = array(front)
		array(front) = -1

		If front = rear Then ' Single element case
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: front = rear = -1;
			rear = -1
			front = rear
		ElseIf front = size - 1 Then ' Wrap around
			front = 0
		Else ' Normal case
			front += 1
		End If

		Return item
	End Function
End Class

Friend Class Program
	Shared Sub Main()
		' Create a circular queue with a specified initial capacity
		Dim circularQueue As New CircularQueue(5)

		' Enqueue elements
		circularQueue.Enqueue(10)
		circularQueue.Enqueue(20)
		circularQueue.Enqueue(30)

		' Dequeue elements
		Console.WriteLine($"Circular Queue Dequeued: {circularQueue.Dequeue()}")
		Console.WriteLine($"Circular Queue Dequeued: {circularQueue.Dequeue()}")
	End Sub
End Class
$vbLabelText   $csharpLabel

C# Queue (How it Works For Developers):圖 3 - OUTPUT:圓形佇列

3.介紹 IronPDF 的 C# 語言#。

當我們深入探討 C# Queue 的功能與應用時,必須探討如何將其無縫整合至實際應用中。 IronPDF 就是這樣一個增強 C# 功能的強大工具。

IronPDF 是一個 C# 函式庫,可簡化 PDF 文件的建立、操作和渲染。 其直觀的 API 可讓開發人員從 HTML、ASPX 甚至純文字產生 PDF。 有了 IronPDF,將 C# Queue 納入 PDF 產生應用程式的過程變得簡化且有效率。

3.1.使用 C# Queue 與 IronPDF 程式碼。

讓我們仔細看看 C# Queue 如何與 IronPDF 配合使用,以建立動態且有條理的 PDF 文件。 考慮一種情況,Web 應用程式需要根據使用者的輸入和要求產生 PDF 報告。

using IronPdf;
using System;
using System.Collections.Generic;

class PdfGenerator
{
    static void Main()
    {
        // Create a C# Queue to store user requests
        Queue<string> userRequests = new Queue<string>();

        // Simulate user requests being added to the queue
        userRequests.Enqueue("Generate PDF for User 1");
        userRequests.Enqueue("Generate PDF for User 2");
        userRequests.Enqueue("Generate PDF for User 3");

        // Process requests and generate PDFs
        while (userRequests.Count > 0)
        {
            string request = userRequests.Dequeue();
            GeneratePdf(request);
        }
    }

    // Method to generate a PDF file using IronPDF
    static void GeneratePdf(string userRequest)
    {
        // Use IronPDF to generate PDF based on user request
        var Renderer = new HtmlToPdf();

        // Render the provided HTML content as a PDF
        var PDF = Renderer.RenderHtmlAsPdf($"<h1>{userRequest}</h1>");

        // Save the generated PDF with the request name as file name
        PDF.SaveAs($"{userRequest.Replace(" ", "_")}.pdf");
    }
}
using IronPdf;
using System;
using System.Collections.Generic;

class PdfGenerator
{
    static void Main()
    {
        // Create a C# Queue to store user requests
        Queue<string> userRequests = new Queue<string>();

        // Simulate user requests being added to the queue
        userRequests.Enqueue("Generate PDF for User 1");
        userRequests.Enqueue("Generate PDF for User 2");
        userRequests.Enqueue("Generate PDF for User 3");

        // Process requests and generate PDFs
        while (userRequests.Count > 0)
        {
            string request = userRequests.Dequeue();
            GeneratePdf(request);
        }
    }

    // Method to generate a PDF file using IronPDF
    static void GeneratePdf(string userRequest)
    {
        // Use IronPDF to generate PDF based on user request
        var Renderer = new HtmlToPdf();

        // Render the provided HTML content as a PDF
        var PDF = Renderer.RenderHtmlAsPdf($"<h1>{userRequest}</h1>");

        // Save the generated PDF with the request name as file name
        PDF.SaveAs($"{userRequest.Replace(" ", "_")}.pdf");
    }
}
Imports IronPdf
Imports System
Imports System.Collections.Generic

Friend Class PdfGenerator
	Shared Sub Main()
		' Create a C# Queue to store user requests
		Dim userRequests As New Queue(Of String)()

		' Simulate user requests being added to the queue
		userRequests.Enqueue("Generate PDF for User 1")
		userRequests.Enqueue("Generate PDF for User 2")
		userRequests.Enqueue("Generate PDF for User 3")

		' Process requests and generate PDFs
		Do While userRequests.Count > 0
			Dim request As String = userRequests.Dequeue()
			GeneratePdf(request)
		Loop
	End Sub

	' Method to generate a PDF file using IronPDF
	Private Shared Sub GeneratePdf(ByVal userRequest As String)
		' Use IronPDF to generate PDF based on user request
		Dim Renderer = New HtmlToPdf()

		' Render the provided HTML content as a PDF
		Dim PDF = Renderer.RenderHtmlAsPdf($"<h1>{userRequest}</h1>")

		' Save the generated PDF with the request name as file name
		PDF.SaveAs($"{userRequest.Replace(" ", "_")}.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

在這個範例中,C# Queue (userRequests) 用來儲存使用者對 PDF 產生的要求。 GeneratePdf 方法接收用戶請求,利用 IronPDF 將 HTML 內容轉換為 PDF 文件,並將生成的 PDF 文件以相關名稱儲存。

這種整合方法也展現了 C# Queue 與 IronPDF 之間的協同效應,使用者請求的有序處理結果就是 PDF 文件的有系統建立。

3.2.輸出 #1

C# Queue (How it Works For Developers):圖 4 - OUTPUT 1: 使用 IronPDF 和 C# Queue 產生 PDF

3.3.輸出 #2

C# Queue (How it Works For Developers):圖 5 - OUTPUT 2:使用 IronPDF 和 C# Queue 產生 PDF

3.4.輸出 #3

C# Queue (How it Works For Developers):圖 6 - OUTPUT 3: 使用 IronPDF 和 C# Queue 產生 PDF

4.結論

總括而言,C# Queue 證明是依序管理和處理資料的寶貴資產。 它對先入先出原則的堅持使其適用於廣泛的應用,從任務排程到 Web 伺服器中的請求處理。 當與 IronPDF等功能強大的函式庫結合時,C# Queue 將變得更加強大,讓開發人員能有效率地建立有組織且動態的 PDF 文件。

瞭解 C# Queue 的細微差異並探討其與 IronPDF 等工具的整合,可讓開發人員設計出強大且有效率的資料管理與處理解決方案。 隨著技術的不斷演進,C# Queue 等基本資料結構與創新函式庫之間的協同效應,將在塑造軟體開發的版圖上扮演舉足輕重的角色。

有關授權資訊,請造訪 IronPDF 授權詳細資訊。 若要瞭解 HTML 至 PDF 轉換的更多資訊,請造訪 HTML 至 PDF 轉換教學

常見問題解答

C# Queues 如何依序管理資料?

C# 佇列以先入先出 (FIFO) 原則運作,確保第一個加入的元素將是第一個移除的元素。這種有系統的順序非常適合需要依序處理資料的情況。

C# 標準佇列中有哪些方法可用於資料處理?

C# 標準佇列提供 Enqueue 等方法,可將元素新增至佇列,以及 Dequeue 等方法,可將元素從佇列移除,方便處理一般資料類型。

如何在 C# 中實現優先順序佇列?

C# 中的優先順序佇列可以使用排序集合或自訂資料結構來實作,允許根據特定條件來排定元素的優先順序,即使內建的優先順序佇列並不存在。

C# 中的迴圈佇列有哪些優點?

圓形佇列在具有固定大小佇列的情況下具有優勢。它們允許循環更換元素,從佇列末端連回到前端,有助於優化記憶體使用。

C# Queue 如何增強 PDF 生成流程?

C# Queue 可透過順序處理每個請求,有效管理 PDF 生成請求。使用 IronPDF,開發人員可以動態地建立和處理 PDF,確保每個請求都能依序處理。

IronPDF 在 C# 開發中扮演什麼角色?

IronPDF 對於需要建立、處理和渲染 PDF 文件的 C# 開發人員來說是不可或缺的。它可以將 HTML、ASPX 或純文字轉換成 PDF,擴充 C# 應用程式的功能。

C# Queue 可以用於 Web 伺服器請求處理嗎?

是的,C# Queue 適合處理 Web 伺服器中的請求。它以先入先出的方式處理資料,因此非常適合管理 HTTP 請求處理和排程等任務。

如何在 C# 中建立並管理一個佇列?

在 C# 中,可以使用 System.Collections.Generic 中的 Queue 類建立佇列。元素可以使用 Enqueue 加入,並使用 Dequeue 移除,遵循先入先出原則。

FIFO 原則在軟體開發中有哪些應用?

FIFO 原則在軟體開發中至關重要,用於管理需要有系統順序的任務、資源和流程,例如列印 spooling、任務排程和請求處理。

如何協同使用佇列和 IronPDF?

佇列可透過排列請求的優先順序來組織 PDF 生成任務,而 IronPDF 則處理實際的 PDF 建立與操作。這種組合為高效的資料處理和文件管理提供了強大的解決方案。

Jacob Mellor, Team Iron 首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技術官,作為 C# PDF 技術的先鋒工程師。作為 Iron Software 核心代碼的原作者,他自開始以來塑造了公司產品架構,與 CEO Cameron Rimington 一起將其轉變為一家擁有超過 50 名員工的公司,為 NASA、特斯拉 和 全世界政府機構服務。

Jacob 持有曼徹斯特大學土木工程一級榮譽学士工程學位(BEng) (1998-2001)。他於 1999 年在倫敦開設了他的第一家軟件公司,並於 2005 年製作了他的首個 .NET 組件,專注於解決 Microsoft 生態系統內的複雜問題。

他的旗艦產品 IronPDF & Iron Suite .NET 庫在全球 NuGet 被安裝超過 3000 萬次,其基礎代碼繼續為世界各地的開發工具提供動力。擁有 25 年的商業經驗和 41 年的編碼專業知識,Jacob 仍專注於推動企業級 C#、Java 及 Python PDF 技術的創新,同時指導新一代技術領袖。