AYUDA .NET

Rendimiento de C# (Cómo funciona para el desarrollador)

Actualizado 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 completa del lenguaje sobre las declaraciones de la palabra clave yield para explorar más sobre su uso en métodos iteradores, que puede ver aquí.

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)
{
    //  el bucle for recorre los números, de principio a fin
    for (int i = start; i <= end; i++) 
    {
        yield return i; //  devuelve cada número sin romper el bucle
    }
}

//  Utilización
//  el bucle foreach llama a la función anterior
foreach (var number in GenerateNumbers(1, 5)) 
{
    Console.WriteLine(number); //  Salidas números 1 - 5
}
public IEnumerable<int> GenerateNumbers(int start, int end)
{
    //  el bucle for recorre los números, de principio a fin
    for (int i = start; i <= end; i++) 
    {
        yield return i; //  devuelve cada número sin romper el bucle
    }
}

//  Utilización
//  el bucle foreach llama a la función anterior
foreach (var number in GenerateNumbers(1, 5)) 
{
    Console.WriteLine(number); //  Salidas números 1 - 5
}
Public Iterator Function GenerateNumbers(ByVal start As Integer, ByVal [end] As Integer) As IEnumerable(Of Integer)
	'  el bucle for recorre los números, de principio a fin
	For i As Integer = start To [end]
		Yield i '  devuelve cada número sin romper el bucle
	Next i
End Function

'  Utilización
'  el bucle foreach llama a la función anterior
For Each number In GenerateNumbers(1, 5)
	Console.WriteLine(number) '  Salidas números 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(); //  devuelve el valor 'a' en medio del bucle for
        int temp = a;
        a = b;
        b = temp + b;
    }
}
//  Utilización
//  bucle foreach que llama a la función iteradora anterior
foreach (var fibNumber in GenerateFibonacci(8))
{
    Console.WriteLine(fibNumber); //  Genera una secuencia de números de Fibonacci
}
public IEnumerable<string> GenerateFibonacci(int count)
{
    int a = 0, b = 1;
    for (int i = 0; i < count; i++)
    {
        yield return a.ToString(); //  devuelve el valor 'a' en medio del bucle for
        int temp = a;
        a = b;
        b = temp + b;
    }
}
//  Utilización
//  bucle foreach que llama a la función iteradora anterior
foreach (var fibNumber in GenerateFibonacci(8))
{
    Console.WriteLine(fibNumber); //  Genera una secuencia de números de Fibonacci
}
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() '  devuelve el valor 'a' en medio del bucle for
		Dim temp As Integer = a
		a = b
		b = temp + b
	Next i
End Function
'  Utilización
'  bucle foreach que llama a la función iteradora anterior
For Each fibNumber In GenerateFibonacci(8)
	Console.WriteLine(fibNumber) '  Genera una secuencia de números de Fibonacci
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;
    }
}

//  Utilización
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;
    }
}

//  Utilización
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

'  Utilización
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>";
//  Crear un nuevo documento PDF
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf");
var htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>";
//  Crear un nuevo documento PDF
var pdfDocument = new IronPdf.ChromePdfRenderer();
pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("C:/GeneratedDocument.pdf");
Dim htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>"
'  Crear un nuevo documento PDF
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 PDF que se guardará en la ubicación especificada. Para obtener información más detallada, visite la página documentación página.

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";
        }

        //  Utilización
        var dynamicContent = GenerateDynamicContent();
        var dynamicPdfContent = $@"
            <html>
            <body>
                <h1>List of Items</h1>
                <ul>
                    {string.Join("", dynamicContent.Select(item => $"<li>{item}</li>"))}
                </ul>
            </body>
            </html>
        ";

        //  Crear un nuevo documento PDF con contenido generado dinámicamente
        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";
        }

        //  Utilización
        var dynamicContent = GenerateDynamicContent();
        var dynamicPdfContent = $@"
            <html>
            <body>
                <h1>List of Items</h1>
                <ul>
                    {string.Join("", dynamicContent.Select(item => $"<li>{item}</li>"))}
                </ul>
            </body>
            </html>
        ";

        //  Crear un nuevo documento PDF con contenido generado dinámicamente
        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";
'		}

		'  Utilización
		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>"

		'  Crear un nuevo documento PDF con contenido generado dinámicamente
		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 un prueba gratuita para probar su funcionalidad completa igual que en el modo comercial. Licencias empezar desde $749.

< ANTERIOR
C# REPL (Cómo funciona para desarrolladores)
SIGUIENTE >
Ordenación de matrices en C# (Cómo funciona para desarrolladores)

¿Listo para empezar? Versión: 2024.7 recién publicada

Descarga gratuita de NuGet Descargas totales: 9,974,197 Ver licencias >
123