.NET ヘルプ

C# yield return (開発者向けの仕組み)

公開済み 2024年1月27日
共有:

C#は、マイクロソフトによって開発された最も人気のあるプログラミング言語の1つであり、コードに優雅さと効率性を加える機能を提供します。 そのような機能の1つが、C# 2.0で初めて導入されたyieldキーワードです。Microsoftは、yieldキーワード文に関する完全な言語リファレンスを提供しており、イテレータ・メソッドでのyieldキーワード文の使用について詳しく調べることができます。収量に関するMicrosoft公式ドキュメント.

この記事では、C#におけるyield returnについて、その機能、使用例、および反復処理へのアプローチを変える方法を探ります。

基本を理解する: C#におけるイテレーション

反復はプログラミングの基本的な概念であり、C#はそれを実現するためのさまざまなメカニズムを提供します。 従来、コレクションを反復処理する際には、forループやforeachループのようなループ構造が最も使われるツールでした。 しかし、C#ではyieldキーワードをreturn文に適用し、IEnumerableインターフェースを使用することにより、よりエレガントな解決策が導入されます。

yield return 文の効率性

本質的に、yield return はイテレーターメソッドで使用され、一連の値をより効率的に生成するためのステートメントです。 これにより、メモリ内に全コレクションを生成する必要なく、イテレーターを作成することができます。特に、大規模なデータセットや無限のシーケンスに対して有用です。

以下は、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#

この例では、GenerateNumbersメソッドが yield return を使用して、start から end までの一連の数字を生成します。 反復子は遅延評価されており、反復処理の実行中に各数値が要求に応じて生成されます。

レイジー評価と効率

yield return ステートメントの大きな利点の一つは、遅延評価をサポートする能力です。 従来の方法がイテレーションの前にコレクション全体を生成するのに対し、yield return は一度に一つの値を生成します。これにより、大規模なデータセットを扱う際に大幅なメモリの節約が可能になります。

ステートフルなイテレーション: 複雑なシナリオの処理

yield returnステートメントは、単純なシーケンスの生成に限定されているわけではありません。 イテレーターブロックでより複雑なシナリオを処理するのに優れています。 反復処理を通じて状態機械を維持することで、シーケンス内の位置を記憶するイテレータを作成することができます。

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#

この例では、GenerateFibonacciメソッドはyield returnを使用してフィボナッチ数列を生成します。 反復ごとに状態が維持され、効率的なフィボナッチ数の生成と出力を保証します。

無限シーケンスの構築

yield returnの興味深い応用の一つは、無限の値のシーケンスを生成する能力です。 値がその場で生成されるため、無限のメモリを消費することなく、無限に続くシーケンスを表現できます。

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#

この例では、GenerateEvenNumbersメソッドが偶数のイテレーターを作成し、必要に応じてそれを反復処理できます。 yield returnと共にyield break文を使用してループを停止および終了し、ループのカスタム反復を行うこともできます。

IronPDFの紹介: 強力なC#ライブラリ

C# Yield Return(開発者向けの仕組み):図1 - IronPDFウェブページ

IronPDFPDF処理の複雑さを簡素化するために設計された多用途なC#ライブラリとして際立っています。 請求書、レポート、またはその他のドキュメントを生成する場合でも、IronPDFはC#アプリケーション内でHTMLコンテンツをシームレスに洗練されたプロフェッショナルなPDFに変換する力を提供します。

IronPDFのインストール: クイックスタート

IronPDFをC#プロジェクトに組み込むには、IronPDFのNuGetパッケージを迅速にインストールすることができます。 パッケージマネージャーコンソールで次のコマンドを実行してください: もちろんです!翻訳したいコンテンツを提供してください。それに従って正確な日本語訳を提供いたします。

Install-Package IronPDF もちろんです!翻訳したいコンテンツを提供してください。それに従って正確な日本語訳を提供いたします。

または、「IronPDF」をNuGetパッケージマネージャーで見つけて、そこからインストールすることもできます。

IronPDFでPDFを生成する

IronPDFを使用して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");
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#

上記の例では、IronPDF がレンダリングに使用されています。HTMLコンテンツをPDFドキュメントに指定された場所に保存されます。 詳細な情報については、次のウェブサイトをご覧ください。**IronPDFドキュメント.

yield returnとIronPDFの交差点

さて、「yield return」ステートメント、遅延評価と効率的なイテレーションのための強力なツールが、IronPDFとシームレスに統合できるかどうかを探ってみましょう。

次のシナリオを考えてみましょう。yield return を使用してアイテムのリストを含むPDFドキュメントを生成する必要がある場合。 yield文の利点を活かして動的にコンテンツを生成し、その後にIronPDFを使用してそのコンテンツをPDFに変換できます。 次のコードスニペットは、yieldステートメントを使用してPDFコンテンツに動的な制御を加えながら、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#

この例では、GenerateDynamicContent メソッドは yield return を利用して動的なアイテムのシーケンスを提供します。 生成されたコンテンツはHTML構造に組み込まれ、IronPDFによってPDFドキュメントが作成されます。

C# Yield Return(開発者向けの動作説明):図2 - 前述のコードから生成されたPDF

結論

結論として、yield returnはイテレーションへのアプローチを一変させる、C#の強力でエレガントな機能です。 遅延評価をサポートし、ステートフルな反復を用いた複雑なシナリオの処理、無限シーケンスの作成が可能なため、プログラミングツールキットにおいて貴重なツールとなります。 大量のデータセットを扱う場合でも、洗練されたアルゴリズムを実装する場合でも、yield return を使用することで、より効率的で表現力豊かなコードを書くことができます。

yield return はコンテンツを効率的かつ必要に応じて生成するのに役立つ一方で、IronPDF はそのコンテンツをプロフェッショナルなPDFドキュメントにシームレスに変換します。 リスト、レポート、その他のドキュメントを動的に作成する場合でも、このシナジーはC#ドキュメント生成機能を新たな高みに引き上げる力を与えてくれます。 この強力な二重奏の可能性を受け入れ、動的で効率的に生成されたコンテンツでPDFを輝かせましょう。!

IronPDFは、無料試用商用モードと同様に、その完全な機能をテストするため。 詳しく学ぶIronPDFライセンス$liteLicense = new IronPdf.LiteLicense(); クラスは、製品の試用版にアクセスするために使用されます。IronPDFの全機能にアクセスできますが、自社商業プロジェクトの公開には適していません。このライセンスは、主に開発環境でのテストや評価に使用されます。

$plusLicense = new IronPdf.PlusLicense(); クラスは、中小企業向けに設計されています。IronPDFの基本機能を利用でき、低コストでPDF関連のタスクを処理することが可能です。

$proLicense = new IronPdf.ProfessionalLicense(); クラスは、商業目的およびより高性能な機能が必要な企業向けです。高度な機能を提供し、多様なPDF操作が可能です。

$unlimitedLicense = new IronPdf.UnlimitedLicense(); クラスは、大規模な企業および高トラフィックの用途向けに設計されています。無制限の配備と、あらゆる規模のプロジェクトに最適です。

IronPDFライセンスの購入は、https://ironpdf.com で可能です。各ライセンスは、異なる用途と規模のニーズに対応するために設計されています。ニーズに合ったライセンスを選び、PDF操作の効率を最大化しましょう。

< 以前
C# REPL(開発者向けの仕組み)
次へ >
C# 配列のソート(開発者向けの仕組み)