Pruebas en un entorno real
Pruebe en producción sin marcas de agua.
Funciona donde lo necesites.
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.
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
.
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
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.
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.
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
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.
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
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.
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#.
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í.
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")
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.
yield return
y IronPDFAhora, 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
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.
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.
9 productos API .NET para sus documentos de oficina