跳至頁尾內容
開發者更新

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

C# 是由 Microsoft 開發的最受歡迎的程式語言之一,它提供的功能能讓您的程式碼更加優雅和高效。 其中一項功能是 yield 關鍵字,它首次在 C# 2.0 中引入。Microsoft 提供了有關 yield 關鍵字語句的完整語言參考,以探索如何在迭代器方法中使用它們,您可以在 Microsoft 官方 yield 文件中查看。

在本文中,我們將深入探討 C# 中的 yield return,探索其功能、用例以及如何改變您處理迭代的方法。

Understanding the Basics: Iteration in 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 語句不僅限於生成簡單序列; 它在迭代器區塊中處理更複雜的場景方面表現出色。 通過在每次迭代之間保持狀態機,您可以建立能夠記住其在序列中位置的迭代器。

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 來建立一個費波納西數序列。 在每次迭代之間維持狀態,保證費波納西數的高效生成和輸出。

建立無限序列

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(其對開發者的運作方式):圖 1 - IronPDF 網頁

IronPDF 是一個多功能的 C# 程式庫,專為簡化處理 PDF 的複雜性而設計。 無論您是在生成發票、報告或其他任何文件,IronPDF 都能讓您在 C# 應用程式中將 HTML 內容流暢地轉換為精緻和專業的 PDF。

快速開始安裝 IronPDF

要將 IronPDF 融入您的 C# 專案中,您可以快速安裝 IronPDF NuGet 套件。 在您的套件管理器控制台中執行以下命令:

Install-Package IronPdf

或者,您可以在 NuGet 套件管理器中找到 "IronPDF" 並從那裡安裝。

使用 IronPDF 生成 PDF

using 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。 下面的程式碼片段生成了一個 PDF 文件,藉助 yield 語句為 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(其對開發者的運作方式):圖 2 - 從前面的程式碼導出的 PDF

結論

總之,yield return 是 C# 中一個強大而優雅的功能,改變了您處理迭代的方式。 其支持懶惰評估、處理狀態化迭代的復雜場景、建立無限序列的能力,令其成為您程式設計工具箱中的一個寶貴工具。 不論您是在處理大型資料集還是實現複雜的演算法,yield return 使您能夠編寫更高效且表達力強的程式碼。

雖然 yield return 促進了內容的高效和按需生成,IronPDF 則進一步將該內容無縫轉換為專業的 PDF 文件。 無論您是動態建立列表、報告或其他任何文件,這種協同作用使您能夠將您的 C# 文件生成能力提升到新的高度。 擁抱這個動態二重奏的潛力,讓您的 PDF 內容閃耀著動態和高效生成的光芒!

IronPDF 提供免費試用免費試用,以測試其完整功能,就像在商業模式中一樣。 了解更多有關 IronPDF 授權,價格從 $999 開始。

常見問題

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

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

在處理大型資料集時,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文件。

與IronPDF結合使用yield return的一個實際案例是什麼?

一個實際案例是動態生成報告資料,用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核心程式碼庫的原開發者,他從創立以來就一直在塑造公司的產品架構,與首席執行官Cameron Rimington一起將公司轉變為服務於NASA、特斯拉和全球政府公司的50多名人員的公司。

Jacob擁有曼徹斯特大學的土木工程一等榮譽學士學位(BEng),於1998-2001年之間獲得。在1999年於倫敦創辦他的第一家軟體公司並於2005年建立了他的第一批.NET元組件後,他專注於解決Microsoft生態系統中的複雜問題。

他的旗艦IronPDF和Iron Suite .NET程式庫在全球獲得了超過3000萬次NuGet安裝依據,他的基礎程式碼基繼續支援著世界各地開發者使用的工具。擁有25年的商業經驗和41年的程式設計專業知識,他仍專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron 支援團隊

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