.NET 幫助

C# Yield Return(它如何運作於開發者)

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

在本文中,我們將探討 C# 中的 yield return,研究其功能、使用案例,以及它如何改變您處理迭代的方式。

了解基礎:C# 中的迭代

迭代是程式設計中的基本概念,C# 提供了多種機制來實現迭代。 傳統上,像forforeach之類的循環一直是迭代集合的首選工具。 然而,C# 通過應用於 return 語句的 yield 關鍵字以及使用 IEnumerable 介面,提供了一個更優雅的解決方案。

yield return語句的效率

從本質上講,yield return 是用於迭代器方法中的一個語句,以更高效的方式生成一系列值。 它允許您在不需要在記憶體中生成整個集合的情況下創建一個迭代器,這對於大型數據集或無窮序列特別有用。

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

public IEnumerable<int> GenerateNumbers(int start, int end)
{
    // for loop goes through numbers, start to end
    for (int i = start; i <= end; i++) 
    {
        yield return i; // returns each number without breaking the loop
    }
}

// Usage
// foreach loop calls the previous function
foreach (var number in GenerateNumbers(1, 5)) 
{
    Console.WriteLine(number); // Outputs numbers 1 - 5
}
public IEnumerable<int> GenerateNumbers(int start, int end)
{
    // for loop goes through numbers, start to end
    for (int i = start; i <= end; i++) 
    {
        yield return i; // returns each number without breaking the loop
    }
}

// Usage
// foreach loop calls the previous function
foreach (var number in GenerateNumbers(1, 5)) 
{
    Console.WriteLine(number); // Outputs numbers 1 - 5
}
Public Iterator Function GenerateNumbers(ByVal start As Integer, ByVal [end] As Integer) As IEnumerable(Of Integer)
	' for loop goes through numbers, start to end
	For i As Integer = start To [end]
		Yield i ' returns each number without breaking the loop
	Next i
End Function

' Usage
' foreach loop calls the previous function
For Each number In GenerateNumbers(1, 5)
	Console.WriteLine(number) ' Outputs numbers 1 - 5
Next number
$vbLabelText   $csharpLabel

在此範例中,GenerateNumbers方法使用yield return來生成從startend的數字序列。 迭代器是惰性求值的,意味著每個數字在迭代執行期間按需生成。

惰性评估與效率

yield return 語句的一個重要優勢是其支持惰性求值的能力。 與在迭代之前生成整個集合的傳統方法不同,yield return一次生成一個值。這可以顯著節省記憶體,特別是在處理大型資料集時。

有狀態迭代:處理複雜場景

yield return 語句不僅限於生成簡單序列; 在迭代器區塊中,它在處理更複雜的情境方面表現優異。 通過在各次迭代中維持狀態機,您可以創建記住其在序列中位置的迭代器。

public IEnumerable<string> GenerateFibonacci(int count)
{
    int a = 0, b = 1;
    for (int i = 0; i < count; i++)
    {
        yield return a.ToString(); // returns 'a' value in the middle of the for loop
        int temp = a;
        a = b;
        b = temp + b;
    }
}
// Usage
// foreach loop that calls the previous iterator function
foreach (var fibNumber in GenerateFibonacci(8))
{
    Console.WriteLine(fibNumber); // Outputs a Fibonacci number sequence
}
public IEnumerable<string> GenerateFibonacci(int count)
{
    int a = 0, b = 1;
    for (int i = 0; i < count; i++)
    {
        yield return a.ToString(); // returns 'a' value in the middle of the for loop
        int temp = a;
        a = b;
        b = temp + b;
    }
}
// Usage
// foreach loop that calls the previous iterator function
foreach (var fibNumber in GenerateFibonacci(8))
{
    Console.WriteLine(fibNumber); // Outputs a Fibonacci number sequence
}
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 'a' value in the middle of the for loop
		Dim temp As Integer = a
		a = b
		b = temp + b
	Next i
End Function
' Usage
' foreach loop that calls the previous iterator function
For Each fibNumber In GenerateFibonacci(8)
	Console.WriteLine(fibNumber) ' Outputs a Fibonacci number sequence
Next fibNumber
$vbLabelText   $csharpLabel

在此範例中,GenerateFibonacci 方法使用 yield return 來創建斐波那契數列。 在迭代之間保持狀態,確保高效生成和輸出斐波那契數字。

建立無限序列

yield return的一個有趣應用是其創建無窮序列值的能力。 由於值是動態生成的,您可以表示無限延續的序列而不會消耗無限記憶體。

public IEnumerable<int> GenerateEvenNumbers()
{
    int num = 0;
    while (true)
    {
        yield return num;
        num += 2;
    }
}

// Usage
var evenNumberIterator = GenerateEvenNumbers().GetEnumerator();
for (int i = 0; i < 5; i++)
{
    evenNumberIterator.MoveNext();
    Console.WriteLine(evenNumberIterator.Current);
}
public IEnumerable<int> GenerateEvenNumbers()
{
    int num = 0;
    while (true)
    {
        yield return num;
        num += 2;
    }
}

// Usage
var evenNumberIterator = GenerateEvenNumbers().GetEnumerator();
for (int i = 0; i < 5; i++)
{
    evenNumberIterator.MoveNext();
    Console.WriteLine(evenNumberIterator.Current);
}
Public Iterator Function GenerateEvenNumbers() As IEnumerable(Of Integer)
	Dim num As Integer = 0
	Do
		Yield num
		num += 2
	Loop
End Function

' Usage
Private evenNumberIterator = GenerateEvenNumbers().GetEnumerator()
For i As Integer = 0 To 4
	evenNumberIterator.MoveNext()
	Console.WriteLine(evenNumberIterator.Current)
Next i
$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

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

var htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>";
// Create a new PDF document
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf");
var htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>";
// Create a new PDF document
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf");
Dim htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>"
' Create a new PDF document
Dim pdfDocument = New IronPdf.ChromePdfRenderer()
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf")
$vbLabelText   $csharpLabel

在上述示例中,使用 IronPDF 將HTML 內容渲染成 PDF 文件,然後將其儲存到指定位置。 欲了解更多詳細信息,請訪問IronPDF 文件

yield return 與 IronPDF 的交集

現在,讓我們探索 yield return 語句這個用於延遲評估和高效迭代的強大工具是否能無縫整合到 IronPDF 中。

考慮一種情況,您需要使用yield return生成包含項目列表的 PDF 文件。 您可以利用yield語句來動態生成內容,然後使用IronPDF將該內容轉換為PDF。 以下程式碼片段透過yield語句生成 PDF 文件,以實現對 PDF 內容的動態控制:

class Program
{
    static void Main(string [] args)
    {
        public IEnumerable<string> GenerateDynamicContent()
        {
            yield return "Item 1";
            yield return "Item 2";
            yield return "Item 3";
        }

        // Usage
        var dynamicContent = GenerateDynamicContent();
        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 dynamicPdfDocument = new IronPdf.ChromePdfRenderer();
        dynamicPdfDocument.RenderHtmlAsPdf(dynamicPdfContent).SaveAs("C:/DynamicItems.pdf");
    }
}
class Program
{
    static void Main(string [] args)
    {
        public IEnumerable<string> GenerateDynamicContent()
        {
            yield return "Item 1";
            yield return "Item 2";
            yield return "Item 3";
        }

        // Usage
        var dynamicContent = GenerateDynamicContent();
        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 dynamicPdfDocument = new IronPdf.ChromePdfRenderer();
        dynamicPdfDocument.RenderHtmlAsPdf(dynamicPdfContent).SaveAs("C:/DynamicItems.pdf");
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'		public IEnumerable(Of string) GenerateDynamicContent()
'		{
'			yield Return "Item 1";
'			yield Return "Item 2";
'			yield Return "Item 3";
'		}

		' Usage
		Dim dynamicContent = GenerateDynamicContent()
, 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 dynamicPdfDocument = New IronPdf.ChromePdfRenderer()
		dynamicPdfDocument.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 授權,起價為 $749。

Chipego
奇佩戈·卡林达
軟體工程師
Chipego 擁有天生的傾聽技能,這幫助他理解客戶問題,並提供智能解決方案。他在獲得信息技術理學學士學位後,于 2023 年加入 Iron Software 團隊。IronPDF 和 IronOCR 是 Chipego 專注的兩個產品,但隨著他每天找到新的方法來支持客戶,他對所有產品的了解也在不斷增長。他喜歡在 Iron Software 的協作生活,公司內的團隊成員從各自不同的經歷中共同努力,創造出有效的創新解決方案。當 Chipego 離開辦公桌時,他常常享受讀好書或踢足球的樂趣。
< 上一頁
C# REPL(對開發人員的運作方式)
下一個 >
C# 陣列排序(開發者是如何工作的)