.NET 幫助

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

發佈 2024年1月27日
分享:

C#是由微軟開發的最受歡迎的編程語言之一,它提供的功能可以讓你的代碼更加優雅和高效。其中一個功能是 yield 關鍵字,該關鍵字首次在 C# 2.0 中引入。微軟提供了完整的 yield 關鍵字語言參考,可以更深入地了解如何在迭代器方法中使用它們,你可以查看 這裡在這篇文章中,我們將探討C#中的yield return,了解其功能、使用案例,以及如何改變你處理迭代的方式。

理解基礎:C# 中的迭代

迭代是程式設計中的基本概念,C# 提供了各種機制來實現它。傳統上,forforeach 迴圈是遍歷集合的首選工具。然而,C# 引入了一個更優雅的解決方案,即將 yield 關鍵字應用於 return 語句,並通過使用 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
VB   C#

在此範例中,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
VB   C#

在此範例中,GenerateFibonacci 方法使用 yield return 來生成 Fibonacci 數列。狀態在每次迭代之間得以維持,確保 Fibonacci 數字的高效生成和輸出。

建立無限序列

一個有趣的 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
VB   C#

在這個例子中,GenerateEvenNumbers方法會創建一個偶數的迭代器,你可以根據需要對其進行迭代。你也可以使用yield break語句連同yield return來停止並退出迴圈,為迴圈創建自定義的迭代。

介紹 IronPDF:一個強大的 C# 程式庫

C# Yield Return(對開發者的工作原理):圖 1 - IronPDF 網頁

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")
VB   C#

在上述範例中,IronPDF 用於渲染 將HTML內容轉換為PDF文件,然後將其保存到指定位置。如需更多詳細資訊,請訪問 文檔 頁面。

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
VB   C#

在此範例中,GenerateDynamicContent 方法利用 yield return 提供一系列動態項目。生成的內容隨後被合併到 HTML 結構中,並由 IronPDF 用來創建 PDF 文件。

C# Yield Return(對開發人員的運作方式):圖2 - 從上述代碼生成的PDF

結論

總結來說,yield return 是 C# 中一個強大而優雅的功能,改變了你處理迭代的方式。它支持延遲評估、處理具有狀態迭代的複雜場景並創建無限序列的能力,這使它成為你程式設計工具包中的寶貴工具。無論你是在處理大型數據集還是實現複雜的算法,yield return 都能讓你編寫更高效且富有表現力的代碼。

yield return 促進了高效且按需生成內容時,IronPDF 會無縫地將這些內容轉換成專業的 PDF 文檔。無論你是在動態創建列表、報告或其他任何文檔,這種協同會讓你在 C# 文檔生成能力上達到新的高度。擁抱這個動態雙劍合璧的潛力,讓你的 PDF 因動態且高效生成的內容而熠熠生輝。!

IronPDF 提供一個 免費試用 來測試其完整的功能,就像在商業模式下一樣。 許可證 從 $749 開始。

< 上一頁
C# REPL(對開發人員的運作方式)
下一個 >
C# 陣列排序(開發者是如何工作的)

準備開始了嗎? 版本: 2024.10 剛剛發布

免費 NuGet 下載 總下載次數: 10,993,239 查看許可證 >