AYUDA .NET

C# Yield Return (Cómo Funciona para Desarrolladores)

Publicado en 27 de enero, 2024
Compartir:

C# es uno de los lenguajes de programación más populares desarrollados por Microsoft, que proporciona características que añaden elegancia y eficacia a su código. Una de estas características es la palabra clave yield, que se introdujo por primera vez en C# 2.0. Microsoft proporciona una referencia lingüística completa sobre las sentencias de la palabra clave yield para profundizar en su uso en métodos iteradores, que puede consultar en la seccióndocumentación oficial de Microsoft sobre rendimiento.

En este artículo, vamos a echar un vistazo a yield return en C#, explorando su funcionalidad, casos de uso, y cómo puede transformar la forma de enfocar la iteración.

Comprender los fundamentos: Iteración en C#

La iteración es un concepto fundamental en programación, y C# ofrece varios mecanismos para conseguirla. Tradicionalmente, los bucles for y foreach han sido las herramientas más utilizadas para iterar sobre colecciones. Sin embargo, C# introduce una solución más elegante con la palabra clave yield aplicada a la sentencia return, y mediante el uso de la interfaz IEnumerable.

La eficacia de la declaración de "rentabilidad

En esencia, yield return es una sentencia utilizada en el método iterador para proporcionar una forma más eficiente de generar una secuencia de valores. Permite crear un iterador sin necesidad de generar una colección entera en memoria, lo que lo hace especialmente útil para grandes conjuntos de datos o secuencias infinitas.

He aquí un sencillo fragmento de código para ilustrar el uso básico de 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#

En este ejemplo, el método GenerateNumbers utiliza yield return para producir una secuencia de números desde start hasta end. El iterador se evalúa perezosamente, lo que significa que cada número se genera bajo demanda durante la ejecución de la iteración.

Evaluación perezosa y eficiencia

Una de las ventajas significativas de la sentencia yield return es su capacidad para soportar la evaluación perezosa. A diferencia de los métodos tradicionales que generan una colección entera antes de la iteración, yield return produce valores de uno en uno. Esto puede suponer un importante ahorro de memoria, sobre todo cuando se trata de grandes conjuntos de datos.

Iteración de estados: Manejo de escenarios complejos

La sentencia yield return no se limita a generar secuencias simples; destaca en el manejo de escenarios más complejos en el bloque iterador. Manteniendo una máquina de estados a través de las iteraciones, puedes crear iteradores que recuerden su posición en la secuencia.

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#

En este ejemplo, el método GenerateFibonacci utiliza yield return para crear una secuencia de números Fibonacci. El estado se mantiene entre iteraciones, lo que garantiza una generación y salida eficientes de los números Fibonacci.

Construir secuencias infinitas

Una aplicación intrigante de yield return es su capacidad para crear secuencias infinitas de valores. Dado que los valores se generan sobre la marcha, puedes representar secuencias que se alargan eternamente sin consumir memoria infinita.

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#

En este ejemplo, el método GenerateEvenNumbers crea un iterador para números pares, y puedes iterar sobre él según necesites. También puede utilizar la sentencia yield break junto con yield return para detener y salir del bucle, haciendo una iteración personalizada para el bucle.

Presentación de IronPDF: Una potente biblioteca C

Rendimiento de C# (Cómo funciona para los desarrolladores): Figura 1 - Página web de IronPDF

IronPDF destaca como una versátil biblioteca de C# diseñada para simplificar las complejidades del trabajo con PDF. Ya sea que esté generando facturas, informes o cualquier otro documento, IronPDF le permite convertir sin problemas contenido HTML en PDF pulidos y profesionales directamente dentro de su aplicación C#.

Instalación de IronPDF: Inicio rápido

Para incorporar IronPDF a su proyecto C#, puede instalar rápidamente el paquete IronPDF NuGet. Ejecute el siguiente comando en la consola del gestor de paquetes:


Instalar el paquete IronPDF

También puede localizar "IronPDF" en el gestor de paquetes NuGet e instalarlo desde allí.

Generación de PDF con IronPDF

Crear un PDF con IronPDF es un proceso sencillo. Veamos un ejemplo básico:

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#

En el ejemplo anterior, IronPDF se utiliza para renderizar**Contenido HTML en un documento PDFque se guardará en la ubicación especificada. Para obtener información más detallada, visite la páginaDocumentación en IronPDF.

La intersección de yield return y IronPDF

Ahora, vamos a explorar si la sentencia yield return, una poderosa herramienta para la evaluación perezosa y la iteración eficiente, puede integrarse perfectamente con IronPDF.

Considere un escenario en el que necesita generar un documento PDF con una lista de elementos utilizando yield return. Puede aprovechar las ventajas de las sentencias yield para generar contenido de forma dinámica y, a continuación, emplear IronPDF para transformar ese contenido en un PDF. El siguiente fragmento de código genera un documento PDF con la ayuda de una sentencia yield para añadir control dinámico sobre el contenido del 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#

En este ejemplo, el método GenerateDynamicContent utiliza yield return para proporcionar una secuencia de elementos dinámicos. A continuación, el contenido generado se incorpora a una estructura HTML y es utilizado por IronPDF para crear un documento PDF.

Rendimiento de C# (Cómo funciona para desarrolladores): Figura 2 - PDF de salida del código anterior

Conclusión

En conclusión, yield return es una característica potente y elegante de C# que transforma la forma de abordar la iteración. Su capacidad para soportar la evaluación perezosa, manejar escenarios complejos con la iteración de estado, y crear secuencias infinitas hace que sea una herramienta valiosa en su conjunto de herramientas de programación. Tanto si trabaja con grandes conjuntos de datos como si implementa algoritmos sofisticados, yield return le permite escribir código más eficiente y expresivo.

Mientras que yield return facilita la generación eficiente y bajo demanda de contenidos, IronPDF interviene para convertir sin problemas esos contenidos en documentos PDF profesionales. Ya se trate de crear listas, informes o cualquier otro documento de forma dinámica, esta sinergia le permite llevar sus capacidades de generación de documentos C# a nuevas cotas. Aproveche el potencial de este dúo dinámico y haga que sus PDF brillen con contenidos dinámicos y generados de forma eficaz.!

IronPDF proporciona unprueba gratuita para probar su funcionalidad completa igual que en el modo comercial. Más informaciónLicencias de IronPDF a partir de $749.

< ANTERIOR
C# REPL (Cómo Funciona para Desarrolladores)
SIGUIENTE >
Clasificación de Arrays en C# (Cómo Funciona para Desarrolladores)

¿Listo para empezar? Versión: 2024.12 acaba de salir

Descarga gratuita de NuGet Descargas totales: 11,622,374 Ver licencias >