C# Yield Return(開發者的工作原理)
C# 是 Microsoft 所開發的最受歡迎程式語言之一,其提供的功能可為您的程式碼增添優雅與效率。 C# 2.0 首次引入的 yield 關鍵字就是其中一項功能。Microsoft 提供了有關 yield 關鍵字語句的完整語言參考,以探索在迭代器方法中使用它們的更多資訊,您可以在 有關 yield 的 Microsoft 官方文件中檢視。
在這篇文章中,我們將探討 C# 中的 yield return,探索其功能、用例,以及它如何改變您處理迭代的方式。
瞭解基礎知識:C# 中的迭代;。
迭代是程式設計中的基本概念,C# 提供各種機制來實現迭代。 傳統上,for 和 foreach 等循環是迭代集合的常用工具。 然而,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在這個範例中,GenerateNumbers 方法使用 yield return 產生一個從 start 到 end 的數字序列。 迭代器採用偷懶式評估,意即在執行迭代期間,每個數字都會依需求產生。
懶惰評估與效率
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在這個範例中,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在這個範例中,GenerateEvenNumbers 方法會為偶數建立一個迭代器,您可以依需要迭代它。 您也可以在使用 yield break 語句的同時,使用 yield return 來停止並離開循環,為循環製作自訂的迭代。
介紹 IronPDF:強大的 C# 函式庫。

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在上述範例中,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在這個範例中,GenerateDynamicContent 方法利用 yield return 來提供動態項的序列。 生成的內容隨後會併入 HTML 結構,並由 IronPDF 使用來建立 PDF 文件。

結論
總而言之,yield return 是 C# 中強大且優雅的功能,可改變您處理迭代的方式。 其支援懶惰評估、以狀態迭代處理複雜情境,以及建立無限序列的能力,使其成為您編程工具包中的重要工具。 無論您是要處理大型資料集或是執行複雜的演算法,yield return 都能讓您寫出更有效率且更具表達力的程式碼。
yield return 有助於按需高效地生成內容,而 IronPDF 則會介入將這些內容無縫轉換為專業的 PDF 文件。 無論您是動態建立清單、報表或任何其他文件,此協同功能都能讓您將 C# 文件產生能力提升到新的高度。 發揮這對動態雙人組的潛力,讓您的 PDF 藉由動態且有效率的內容產生而大放異彩!
常見問題解答
如何在 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。







