.NET-HILFE

C# Yield Return (So funktioniert es für Entwickler)

Veröffentlicht 27. Januar 2024
Teilen Sie:

C# ist eine der beliebtesten Programmiersprachen, die von Microsoft entwickelt wurde. Sie bietet Funktionen, die Ihrem Code Eleganz und Effizienz verleihen. Ein solches Feature ist das Yield-Schlüsselwort, das erstmals in C# 2.0 eingeführt wurde. Microsoft bietet eine vollständige Sprachreferenz zu den Yield-Schlüsselwortanweisungen, um mehr über deren Verwendung in Iteratormethoden zu erfahren hier.

In diesem Artikel befassen wir uns mit yield return in C# und untersuchen seine Funktionalität, Anwendungsfälle und wie es die Art und Weise verändern kann, wie Sie Iteration angehen.

Die Grundlagen verstehen: Iteration in C##

Iteration ist ein grundlegendes Konzept in der Programmierung, und C# bietet verschiedene Mechanismen, um dies zu erreichen. Traditionell sind Schleifen wie die for- und die foreach-Schleife die bevorzugten Werkzeuge für die Iteration über Sammlungen. C# bietet jedoch eine elegantere Lösung mit dem Schlüsselwort yield, das auf die Anweisung return angewendet wird, und durch die Verwendung der Schnittstelle IEnumerable.

Die Effizienz der "Rendite"-Erklärung

Im Kern ist "yield return" eine Anweisung, die in der Iterator-Methode verwendet wird, um eine effizientere Methode zur Erzeugung einer Folge von Werten zu bieten. Damit können Sie einen Iterator erstellen, ohne eine ganze Sammlung im Speicher erzeugen zu müssen, was besonders bei großen Datensätzen oder unendlichen Sequenzen nützlich ist.

Hier ist ein einfacher Codeschnipsel zur Veranschaulichung der grundlegenden Verwendung von 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#

In diesem Beispiel verwendet die Methode GenerateNumbers yield return, um eine Folge von Zahlen von start bis end zu erzeugen. Der Iterator wird träge ausgewertet, d. h. jede Zahl wird bei Bedarf während der Ausführung der Iteration erzeugt.

Faule Bewertung und Effizienz

Einer der wesentlichen Vorteile der Anweisung yield return ist ihre Fähigkeit, eine träge Auswertung zu unterstützen. Im Gegensatz zu herkömmlichen Methoden, die vor der Iteration eine ganze Sammlung erzeugen, werden bei yield return die Werte einzeln erzeugt. Dies kann zu erheblichen Speichereinsparungen führen, insbesondere bei großen Datensätzen.

Zustandsabhängige Iteration: Handhabung komplexer Szenarien

Die Anweisung yield return ist nicht nur auf die Erzeugung einfacher Sequenzen beschränkt; es zeichnet sich durch die Handhabung komplexerer Szenarien im Iteratorblock aus. Indem Sie einen Zustandsautomaten über Iterationen hinweg beibehalten, können Sie Iteratoren erstellen, die sich ihre Position in der Sequenz merken.

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#

In diesem Beispiel verwendet die Methode GenerateFibonacci yield return, um eine Fibonacci-Zahlenfolge zu erstellen. Der Zustand wird zwischen den Iterationen beibehalten, was eine effiziente Erzeugung und Ausgabe von Fibonacci-Zahlen gewährleistet.

Aufbau unendlicher Sequenzen

Eine faszinierende Anwendung von yield return ist seine Fähigkeit, unendliche Folgen von Werten zu erzeugen. Da die Werte in Echtzeit generiert werden, können Sie unendlich lange Sequenzen darstellen, ohne unendlich viel Speicher zu verbrauchen.

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#

In diesem Beispiel erzeugt die Methode GenerateEvenNumbers einen Iterator für gerade Zahlen, über den Sie nach Bedarf iterieren können. Sie können auch die Anweisung "yield break" zusammen mit "yield return" verwenden, um die Schleife anzuhalten und zu beenden und eine eigene Iteration für die Schleife zu erstellen.

Einführung in IronPDF: Eine leistungsstarke C#-Bibliothek

C# Rendite Rendite (Wie es für Entwickler funktioniert): Abbildung 1 - IronPDF-Webseite

IronPDF zeichnet sich als vielseitige C#-Bibliothek aus, die die komplexe Arbeit mit PDFs vereinfacht. Egal, ob Sie Rechnungen, Berichte oder andere Dokumente erstellen, IronPDF ermöglicht Ihnen die nahtlose Konvertierung von HTML-Inhalten in ausgefeilte und professionelle PDFs direkt in Ihrer C#-Anwendung.

Installation von IronPDF: Ein Schnellstart

Um IronPDF in Ihr C#-Projekt einzubinden, können Sie das IronPDF NuGet-Paket schnell installieren. Führen Sie den folgenden Befehl in Ihrer Paketmanager-Konsole aus:


Installations-Paket IronPDF

Alternativ können Sie "IronPDF" im NuGet Package Manager suchen und von dort aus installieren.

Erzeugen von PDFs mit IronPDF

Die Erstellung einer PDF-Datei mit IronPDF ist ein unkomplizierter Prozess. Schauen wir uns ein einfaches Beispiel an:

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#

Im obigen Beispiel wird IronPDF zum Rendern verwendet HTML-Inhalt in ein PDF-Dokumentdie dann an dem angegebenen Ort gespeichert wird. Ausführlichere Informationen finden Sie auf der Website Dokumentation seite.

Die Schnittmenge von "Rendite" und IronPDF

Lassen Sie uns nun untersuchen, ob die Anweisung yield return, ein leistungsfähiges Werkzeug für träge Auswertung und effiziente Iteration, nahtlos in IronPDF integriert werden kann.

Stellen Sie sich ein Szenario vor, in dem Sie ein PDF-Dokument mit einer Liste von Elementen unter Verwendung von yield return erzeugen müssen. Sie können die Vorteile der "yield"-Anweisungen nutzen, um dynamisch Inhalte zu generieren und diese dann mit IronPDF in ein PDF-Dokument umzuwandeln. Das folgende Codeschnipsel generiert ein PDF-Dokument mit Hilfe einer "yield"-Anweisung, um die dynamische Kontrolle über den PDF-Inhalt hinzuzufügen:

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#

In diesem Beispiel verwendet die Methode "GenerateDynamicContent" "Yield Return", um eine Folge von dynamischen Elementen bereitzustellen. Der generierte Inhalt wird dann in eine HTML-Struktur eingebunden und von IronPDF zur Erstellung eines PDF-Dokuments verwendet.

C# Rendite Rendite (Wie es für Entwickler funktioniert): Abbildung 2 - PDF-Ausgabe des vorherigen Codes

Schlussfolgerung

Zusammenfassend lässt sich sagen, dass yield return eine mächtige und elegante Funktion in C# ist, die die Art und Weise, wie man an Iteration herangeht, verändert. Seine Fähigkeit, träge Auswertung zu unterstützen, komplexe Szenarien mit zustandsbehafteter Iteration zu behandeln und unendliche Sequenzen zu erstellen, macht es zu einem wertvollen Werkzeug in Ihrem Programmier-Toolkit. Ganz gleich, ob Sie mit großen Datensätzen arbeiten oder anspruchsvolle Algorithmen implementieren, yield return ermöglicht es Ihnen, effizienteren und aussagekräftigeren Code zu schreiben.

Während "Yield Return" die effiziente und bedarfsgerechte Erstellung von Inhalten erleichtert, sorgt IronPDF für die nahtlose Konvertierung dieser Inhalte in professionelle PDF-Dokumente. Ganz gleich, ob Sie Listen, Berichte oder andere Dokumente dynamisch erstellen, diese Synergie ermöglicht es Ihnen, Ihre C#-Dokumentenerstellungsfähigkeiten auf ein neues Niveau zu heben. Nutzen Sie das Potenzial dieses dynamischen Duos, und lassen Sie Ihre PDFs mit dynamischen und effizient generierten Inhalten glänzen!

IronPDF bietet eine kostenloser Test um die vollständige Funktionalität wie im kommerziellen Modus zu testen. Lizenzen von $749 starten.

< PREVIOUS
C# REPL (Wie es für Entwickler funktioniert)
NÄCHSTES >
C# Array Sort (Wie es für Entwickler funktioniert)

Sind Sie bereit, loszulegen? Version: 2024.10 gerade veröffentlicht

Gratis NuGet-Download Downloads insgesamt: 11,308,499 Lizenzen anzeigen >