跳過到頁腳內容
.NET幫助

C# Yield Return(開發者的工作原理)

C# 是 Microsoft 所開發的最受歡迎程式語言之一,其提供的功能可為您的程式碼增添優雅與效率。 C# 2.0 首次引入的 yield 關鍵字就是其中一項功能。Microsoft 提供了有關 yield 關鍵字語句的完整語言參考,以探索在迭代器方法中使用它們的更多資訊,您可以在 有關 yield 的 Microsoft 官方文件中檢視。

在這篇文章中,我們將探討 C# 中的 yield return,探索其功能、用例,以及它如何改變您處理迭代的方式。

Understanding the Basics: Iteration in C#

迭代是程式設計中的基本概念,C# 提供各種機制來實現迭代。 傳統上,forforeach 等循環是迭代集合的常用工具。 然而,C# 引入了一種更優雅的解決方案,即在return語句中使用yield關鍵字,並透過使用 IEnumerable 介面。

yield return 聲明的效率

從本質上講,yield return 是迭代器方法中使用的語句,用於提供一種更有效率的方式來產生值序列。 它可讓您建立迭代器,而不需要在記憶體中產生整個集合,因此對於大型資料集或無限序列特別有用。

以下是一個簡單的程式碼片段,用於說明 yield return 的基本用法:

using System;
using System.Collections.Generic;

public class Example
{
    // Method that generates numbers from start to end using 'yield return'
    public IEnumerable<int> GenerateNumbers(int start, int end)
    {
        // Loop from 'start' to 'end'
        for (int i = start; i <= end; i++)
        {
            yield return i; // Returns each number in the sequence without breaking the loop
        }
    }

    public static void Main()
    {
        // Usage: Using 'foreach' to iterate over numbers generated by 'GenerateNumbers'
        foreach (var number in new Example().GenerateNumbers(1, 5))
        {
            Console.WriteLine(number); // Outputs numbers 1 - 5
        }
    }
}
using System;
using System.Collections.Generic;

public class Example
{
    // Method that generates numbers from start to end using 'yield return'
    public IEnumerable<int> GenerateNumbers(int start, int end)
    {
        // Loop from 'start' to 'end'
        for (int i = start; i <= end; i++)
        {
            yield return i; // Returns each number in the sequence without breaking the loop
        }
    }

    public static void Main()
    {
        // Usage: Using 'foreach' to iterate over numbers generated by 'GenerateNumbers'
        foreach (var number in new Example().GenerateNumbers(1, 5))
        {
            Console.WriteLine(number); // Outputs numbers 1 - 5
        }
    }
}
Imports System
Imports System.Collections.Generic

Public Class Example
	' Method that generates numbers from start to end using 'yield return'
	Public Iterator Function GenerateNumbers(ByVal start As Integer, ByVal [end] As Integer) As IEnumerable(Of Integer)
		' Loop from 'start' to 'end'
		For i As Integer = start To [end]
			Yield i ' Returns each number in the sequence without breaking the loop
		Next i
	End Function

	Public Shared Sub Main()
		' Usage: Using 'foreach' to iterate over numbers generated by 'GenerateNumbers'
		For Each number In (New Example()).GenerateNumbers(1, 5)
			Console.WriteLine(number) ' Outputs numbers 1 - 5
		Next number
	End Sub
End Class
$vbLabelText   $csharpLabel

在這個例子中,GenerateNumbers 方法使用 yield return 產生從 startend 的數字序列。 迭代器採用偷懶式評估,意即在執行迭代期間,每個數字都會依需求產生。

懶惰評估與效率

yield return 語句的一個顯著優點是它能夠支援惰性求值。 與傳統方法在迭代前產生整個集合不同,yield return 每次產生一個值。這可以顯著節省內存,尤其是在處理大型資料集時。

穩定的迭代:處理複雜的情境。

yield return 語句不限於產生簡單序列; 它擅長處理 iterator 區塊中較複雜的情況。 透過在迭代中維護狀態機器,您可以建立能記住其在序列中位置的迭代器。

using System;
using System.Collections.Generic;

public class FibonacciExample
{
    // Method that generates Fibonacci numbers up to the specified count
    public IEnumerable<string> GenerateFibonacci(int count)
    {
        int a = 0, b = 1;
        for (int i = 0; i < count; i++)
        {
            yield return a.ToString(); // Returns the Fibonacci number as a string
            int temp = a;
            a = b;
            b = temp + b;
        }
    }

    public static void Main()
    {
        // Usage: Iterating over Fibonacci numbers generated by 'GenerateFibonacci'
        foreach (var fibNumber in new FibonacciExample().GenerateFibonacci(8))
        {
            Console.WriteLine(fibNumber); // Outputs a Fibonacci number sequence
        }
    }
}
using System;
using System.Collections.Generic;

public class FibonacciExample
{
    // Method that generates Fibonacci numbers up to the specified count
    public IEnumerable<string> GenerateFibonacci(int count)
    {
        int a = 0, b = 1;
        for (int i = 0; i < count; i++)
        {
            yield return a.ToString(); // Returns the Fibonacci number as a string
            int temp = a;
            a = b;
            b = temp + b;
        }
    }

    public static void Main()
    {
        // Usage: Iterating over Fibonacci numbers generated by 'GenerateFibonacci'
        foreach (var fibNumber in new FibonacciExample().GenerateFibonacci(8))
        {
            Console.WriteLine(fibNumber); // Outputs a Fibonacci number sequence
        }
    }
}
Imports System
Imports System.Collections.Generic

Public Class FibonacciExample
	' Method that generates Fibonacci numbers up to the specified count
	Public Iterator Function GenerateFibonacci(ByVal count As Integer) As IEnumerable(Of String)
		Dim a As Integer = 0, b As Integer = 1
		For i As Integer = 0 To count - 1
			Yield a.ToString() ' Returns the Fibonacci number as a string
			Dim temp As Integer = a
			a = b
			b = temp + b
		Next i
	End Function

	Public Shared Sub Main()
		' Usage: Iterating over Fibonacci numbers generated by 'GenerateFibonacci'
		For Each fibNumber In (New FibonacciExample()).GenerateFibonacci(8)
			Console.WriteLine(fibNumber) ' Outputs a Fibonacci number sequence
		Next fibNumber
	End Sub
End Class
$vbLabelText   $csharpLabel

在這個例子中,GenerateFibonacci 方法使用 yield return 來建立一個斐波那契數列。 在迭代之間維持狀態,確保有效率地產生和輸出 Fibonacci 數字。

建立無限序列

yield return 的一個有趣應用是它能夠創建無限的值序列。 由於值是即時產生的,因此您可以表示永遠持續下去的序列,而不會消耗無限的記憶體。

using System;
using System.Collections.Generic;

public class InfiniteSequenceExample
{
    // Method that generates an infinite sequence of even numbers
    public IEnumerable<int> GenerateEvenNumbers()
    {
        int num = 0;
        while (true)
        {
            yield return num;
            num += 2;
        }
    }

    public static void Main()
    {
        // Usage: Generating even numbers using the 'GenerateEvenNumbers' method
        var evenNumberIterator = new InfiniteSequenceExample().GenerateEvenNumbers().GetEnumerator();
        for (int i = 0; i < 5; i++)
        {
            evenNumberIterator.MoveNext();
            Console.WriteLine(evenNumberIterator.Current); // Outputs the first 5 even numbers
        }
    }
}
using System;
using System.Collections.Generic;

public class InfiniteSequenceExample
{
    // Method that generates an infinite sequence of even numbers
    public IEnumerable<int> GenerateEvenNumbers()
    {
        int num = 0;
        while (true)
        {
            yield return num;
            num += 2;
        }
    }

    public static void Main()
    {
        // Usage: Generating even numbers using the 'GenerateEvenNumbers' method
        var evenNumberIterator = new InfiniteSequenceExample().GenerateEvenNumbers().GetEnumerator();
        for (int i = 0; i < 5; i++)
        {
            evenNumberIterator.MoveNext();
            Console.WriteLine(evenNumberIterator.Current); // Outputs the first 5 even numbers
        }
    }
}
Imports System
Imports System.Collections.Generic

Public Class InfiniteSequenceExample
	' Method that generates an infinite sequence of even numbers
	Public Iterator Function GenerateEvenNumbers() As IEnumerable(Of Integer)
		Dim num As Integer = 0
		Do
			Yield num
			num += 2
		Loop
	End Function

	Public Shared Sub Main()
		' Usage: Generating even numbers using the 'GenerateEvenNumbers' method
		Dim evenNumberIterator = (New InfiniteSequenceExample()).GenerateEvenNumbers().GetEnumerator()
		For i As Integer = 0 To 4
			evenNumberIterator.MoveNext()
			Console.WriteLine(evenNumberIterator.Current) ' Outputs the first 5 even numbers
		Next i
	End Sub
End Class
$vbLabelText   $csharpLabel

在這個例子中,GenerateEvenNumbers 方法建立了一個偶數迭代器,您可以根據需要對其進行迭代。 您也可以使用 yield break 語句以及 yield return 語句來停止和退出循環,從而為循環建立一個自訂迭代。

介紹 IronPDF:強大的 C# 函式庫。

C# Yield Return (How It Works For Developers):圖 1 - IronPDF 網頁

IronPDF是一個多功能的 C# 函式庫,旨在簡化處理 PDF 的複雜性。 無論您是要產生發票、報告或任何其他文件,IronPDF 都能讓您直接在 C# 應用程式中,將 HTML 內容無縫轉換為精緻且專業的 PDF。

安裝 IronPDF:快速入門

若要將 IronPDF 納入您的 C# 專案,您可以迅速安裝 IronPDF NuGet 套件。 在套件管理員控制台執行下列指令:

Install-Package IronPdf

另外,您也可以在 NuGet 套件管理員中找到"IronPDF",並從中安裝。

使用 IronPDF 生成 PDF。

使用 IronPDF 創建 PDF 是一個簡單直接的過程。 讓我們考慮一個基本的例子:

using IronPdf;

public class PdfGenerationExample
{
    public static void Main()
    {
        var htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>";

        // Create a new PDF renderer instance
        var pdfRenderer = new ChromePdfRenderer();

        // Render the HTML content as a PDF and save it to a file
        pdfRenderer.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf");
    }
}
using IronPdf;

public class PdfGenerationExample
{
    public static void Main()
    {
        var htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>";

        // Create a new PDF renderer instance
        var pdfRenderer = new ChromePdfRenderer();

        // Render the HTML content as a PDF and save it to a file
        pdfRenderer.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf");
    }
}
Imports IronPdf

Public Class PdfGenerationExample
	Public Shared Sub Main()
		Dim htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>"

		' Create a new PDF renderer instance
		Dim pdfRenderer = New ChromePdfRenderer()

		' Render the HTML content as a PDF and save it to a file
		pdfRenderer.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

在上述範例中,IronPDF 用來將 HTML 內容渲染為 PDF 文件,然後將其儲存到指定位置。 如需詳細資訊,請造訪 IronPDF說明文件

yield return 與 IronPDF 的交集

現在,讓我們來探討一下 yield return 語句(一種用於惰性求值和高效迭代的強大工具)是否可以與 IronPDF 無縫整合。

假設你需要產生一個包含項目清單的 PDF 文檔,使用 yield return。 您可以利用 yield 語句的優勢來動態產生內容,然後使用 IronPDF 將該內容轉換為 PDF。 以下程式碼片段借助 yield 語句產生 PDF 文檔,從而為 PDF 內容添加動態控制:

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

class Program
{
    // Method that dynamically generates content using 'yield return'
    public static IEnumerable<string> GenerateDynamicContent()
    {
        yield return "Item 1";
        yield return "Item 2";
        yield return "Item 3";
    }

    public static void Main(string[] args)
    {
        // Generate dynamic content using the 'GenerateDynamicContent' function
        var dynamicContent = GenerateDynamicContent();

        // Create HTML structure for the PDF document with dynamic content
        var dynamicPdfContent = $@"
            <html>
            <body>
                <h1>List of Items</h1>
                <ul>
                    {string.Join("", dynamicContent.Select(item => $"<li>{item}</li>"))}
                </ul>
            </body>
            </html>
        ";

        // Create a new PDF document with dynamically generated content
        var dynamicPdfRenderer = new ChromePdfRenderer();
        dynamicPdfRenderer.RenderHtmlAsPdf(dynamicPdfContent).SaveAs("C:/DynamicItems.pdf");
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using IronPdf;

class Program
{
    // Method that dynamically generates content using 'yield return'
    public static IEnumerable<string> GenerateDynamicContent()
    {
        yield return "Item 1";
        yield return "Item 2";
        yield return "Item 3";
    }

    public static void Main(string[] args)
    {
        // Generate dynamic content using the 'GenerateDynamicContent' function
        var dynamicContent = GenerateDynamicContent();

        // Create HTML structure for the PDF document with dynamic content
        var dynamicPdfContent = $@"
            <html>
            <body>
                <h1>List of Items</h1>
                <ul>
                    {string.Join("", dynamicContent.Select(item => $"<li>{item}</li>"))}
                </ul>
            </body>
            </html>
        ";

        // Create a new PDF document with dynamically generated content
        var dynamicPdfRenderer = new ChromePdfRenderer();
        dynamicPdfRenderer.RenderHtmlAsPdf(dynamicPdfContent).SaveAs("C:/DynamicItems.pdf");
    }
}
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports IronPdf

Friend Class Program
	' Method that dynamically generates content using 'yield return'
	Public Shared Iterator Function GenerateDynamicContent() As IEnumerable(Of String)
		Yield "Item 1"
		Yield "Item 2"
		Yield "Item 3"
	End Function

	Public Shared Sub Main(ByVal args() As String)
		' Generate dynamic content using the 'GenerateDynamicContent' function
		Dim dynamicContent = GenerateDynamicContent()

		' Create HTML structure for the PDF document with dynamic content
, String.Join(TangibleTempVerbatstring.Format(mDoubleQuote, dynamicContent.Select(Function(item) $TangibleTempVerbatimCloseTag"<li>{item}</li>")), TangibleStringInterpolationMarker) var dynamicPdfContent = $"TangibleTempVerbatimOpenTagTangibleTempVerbatimStringLiteralLineJoin            <html>TangibleTempVerbatimStringLiteralLineJoin            <body>TangibleTempVerbatimStringLiteralLineJoin                <h1>List of Items</h1>TangibleTempVerbatimStringLiteralLineJoin                <ul>TangibleTempVerbatimStringLiteralLineJoin                    {0}ignoreignoreignoreignoreignore</ul></body></html>"

		' Create a new PDF document with dynamically generated content
		Dim dynamicPdfRenderer = New ChromePdfRenderer()
		dynamicPdfRenderer.RenderHtmlAsPdf(dynamicPdfContent).SaveAs("C:/DynamicItems.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

在這個例子中,GenerateDynamicContent 方法利用 yield return 提供一系列動態項目。 生成的內容隨後會併入 HTML 結構,並由 IronPDF 使用來建立 PDF 文件。

C# Yield Return (How It Works For Developers):圖 2 - 從之前的程式碼輸出 PDF

結論

總之,yield return 是 C# 中一個強大而優雅的功能,它改變了你進行迭代的方式。 其支援懶惰評估、以狀態迭代處理複雜情境,以及建立無限序列的能力,使其成為您編程工具包中的重要工具。 無論您是在處理大型資料集還是實現複雜的演算法,yield return 都能幫助您編寫更有效率、更具表現力的程式碼。

雖然 yield return 能夠有效率且隨選地產生內容,但 IronPDF 可以無縫地將這些內容轉換為專業的 PDF 文件。 無論您是動態建立清單、報表或任何其他文件,此協同功能都能讓您將 C# 文件產生能力提升到新的高度。 發揮這對動態雙人組的潛力,讓您的 PDF 藉由動態且有效率的內容產生而大放異彩!

IronPDF 提供免費試用,可像商業模式一樣測試其完整功能。 了解更多關於IronPDF 許可證的信息,許可證編號為 $999。

常見問題解答

如何使用 yield return 語句來增強 C# 中的迭代?

在 C# 中,可以利用 yield return 語句高效生成序列。它允許創建按需生產值的迭代器,這有助於節省記憶體,因為不需要儲存整個集合。

在處理大型數據集時,yield return 提供了哪些優勢?

yield return 提供了延遲評估的優勢,這意味著僅在需要時生成值。在處理大型數據集時,這顯著降低了記憶體使用量,因為不需要將完整序列存儲在記憶體中。

yield return 可以與 C# 中的 PDF 生成結合使用嗎?

是的,yield return 可以用來動態生成內容,然後使用 IronPDF 將其轉換為 PDF 格式。這種方法促進了在 C# 應用程式內的高效和動態文檔生成。

yield return 如何簡化 C# 中無限序列的創建?

yield return 通過即時生成值簡化了無限序列的創建。這意味着它可以無限期地生成值而不會耗盡記憶體,因為它僅在需要時創建每個元素。

在 C# 編程環境中,延遲評估有什麼好處?

在 C# 中,延遲評估藉由 yield return 使得值僅在迭代過程中需要時才計算。這導致更高效的記憶體使用,並在處理大量或複雜的數據序列時可以提高性能。

如何使用 C# 庫將 HTML 內容轉換為 PDF?

您可以使用 IronPDF 庫在 C# 中將 HTML 內容轉換為 PDF。庫中的 ChromePdfRenderer 可以將 HTML 和 CSS 轉換成專業級的 PDF 文件。

yield return 與 IronPDF 的實際用例是什麼?

實際用例是動態生成報告數據,然後使用 IronPDF 將這些數據轉換為 PDF。這種方法對於創建動態文檔非常有效,因為無需在記憶體中預生成所有內容。

在 C# 中使用 yield return 對開發人員有哪些主要好處?

yield return 提供了多個好處,包括透過延遲評估提高記憶體效率、管理複雜的迭代方案的能力,以及生成無限序列而不會記憶體溢出的潛力。

如何安裝處理 PDF 的 C# 庫?

要在 C# 專案中安裝像 IronPDF 這樣的 PDF 操作庫,您可以使用 NuGet 套件管理器,命令如下:Install-Package IronPDF

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

Jacob Mellor是Iron Software的首席技術官,也是開創C# PDF技術的前瞻性工程師。作為Iron Software核心代碼庫的原始開發者,他自公司成立以來就塑造了公司的產品架構,並與CEO Cameron Rimington將公司轉型為服務NASA、Tesla以及全球政府機構的50多人公司。

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

他的旗艦作品IronPDF和Iron Suite .NET程式庫全球已獲得超過3000萬次NuGet安裝,他的基礎代碼不斷在全球各地驅動開發者工具。擁有25年以上的商業經驗和41年的編碼專業知識,Jacob仍然專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我