.NET 幫助

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

發佈 2024年1月27日
分享:

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
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 來創建斐波那契數列。 在迭代之間保持狀態,確保高效生成和輸出斐波那契數字。

建立無限序列

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作為一個多功能的 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文件,然後儲存到指定位置。 欲了解更多詳細信息,請訪問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
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 提供一個免費試用以商業模式來測試其完整功能。 進一步了解IronPDF 授權開始於 $749。

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

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

免費 NuGet 下載 總下載次數: 11,622,374 查看許可證 >