跳至页脚内容
.NET 帮助

C# Yield Return(开发者如何使用)

C#是微软开发的最流行的编程语言之一,它提供的功能使您的代码更优雅和高效。 其中一个这样的特性是yield关键字,该关键字最早在C# 2.0中引入。微软在其官方文档上提供了有关yield关键字语句的完整语言参考,以便您探索如何在迭代器方法中使用它们。

在本文中,我们将在C#中研究yield return,探讨其功能、用例以及如何改变您处理迭代的方式。

理解基础: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创建一个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
$vbLabelText   $csharpLabel

在此示例中,GenerateEvenNumbers方法为偶数创建了一个迭代器,您可以根据需要对其进行迭代。 您也可以使用yield break语句与yield return一起终止并退出循环,为循环创建自定义迭代。

介绍IronPDF:一个强大的C#库

C# Yield Return(如何为开发人员工作):图1 - IronPDF网页

IronPDF是一个多功能的C#库,旨在简化处理PDF的复杂性。 IronPDF的主要特性是其HTML到PDF转换工具,确保布局和样式保持不变。

安装 IronPDF:快速入门

要将IronPDF集成到您的C#项目中,您可以快速安装IronPDF NuGet包。 或者,在NuGet包管理器中找到“IronPDF”并继续安装。

Install-Package IronPdf

或者,您可以在NuGet包管理器中查找"IronPDF"并从那里安装。

使用 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中。

考虑一个场景,您需要使用yield return生成带有项目列表的PDF文档。 您可以利用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许可证,起价为$799。

常见问题解答

如何使用 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 文档。

yield return 与 IronPDF 的实际应用场景是什么?

实际应用场景是通过 yield return 动态生成报告数据,然后使用 IronPDF 将该数据转换为 PDF。这种方法对于在内存中不预生成所有内容而创建动态文档是高效的。

对开发人员来说,在 C# 中使用 yield return 的主要好处是什么?

yield return 提供了多种好处,包括通过懒惰求值提高内存效率、管理复杂迭代场景的能力,以及生成无限序列而不会导致内存溢出的潜力。

我如何安装用于 PDF 操作的 C# 库?

要在 C# 项目中安装 IronPDF 之类的用于 PDF 操作的库,您可以使用 NuGet 包管理器,命令:Install-Package IronPDF

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。