跳過到頁腳內容
.NET幫助

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

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

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

瞭解基礎知識:C# 中的迭代;。

迭代是程式設計中的基本概念,C# 提供各種機制來實現迭代。 傳統上,forforeach 等循環是迭代集合的常用工具。 然而,C# 引入了一個更優雅的解決方案,將 yield 關鍵字應用於 return 語句,並透過使用 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 數列。 在迭代之間維持狀態,確保有效率地產生和輸出 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 無縫整合。

考慮一種情況,您需要使用 yield return 產生一個包含項目清單的 PDF 文件。 您可以利用 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 提供免費試用,可像商業模式一樣測試其完整功能。 從 $799 開始瞭解 IronPDF授權的更多資訊。

常見問題解答

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

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

在處理大型資料集時,產量回報有哪些優勢?

Yield return 提供懶惰評估的優點,也就是只在需要時才產生值。這可在處理大型資料集時大幅降低記憶體使用量,因為完整的序列不需要儲存在記憶體中。

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

是的,產量回報可以用來動態產生內容,然後用 IronPDF 轉換成 PDF 格式。此方法有助於在 C# 應用程式中有效率地動態產生文件。

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

Yield return 透過即時產生數值,簡化了無限序列的建立。這表示它可以無限次持續產生值,而不會耗盡記憶體,因為它只會在需要時才建立每個元素。

在 C# 程式設計中,懶惰評估有什麼好處?

在 C# 中,由 yield return 促成的 lazy evaluation 允許在迭代過程中僅在需要時計算值。這可提高記憶體使用效率,並可在處理大量或複雜的資料序列時改善效能。

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

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

使用 IronPDF 進行收益率回報的實際用例是什麼?

一個實際的使用案例是使用 yield return 動態產生報表資料,然後再使用 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 一起將其轉變為一家擁有超過 50 名員工的公司,為 NASA、特斯拉 和 全世界政府機構服務。

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

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