C#のイテレータとは?yield returnによる反復処理の基本を解説
イテレータとは
イテレータ(Iterator)は、コレクションに対して独自の反復処理(イテレーション)を実行するための仕組みです。C#では、yield returnステートメントを使用することで、コレクションの各要素を1つずつ順番に返すことができます。
イテレータは現在の実行位置を記憶しています。そのため、次に反復処理が要求されたときには、前回の続きから次の要素が返されます。この特性により、大量のデータを扱う場合でもメモリ効率の良い処理が可能になります。
サンプルコード
以下は、C#でイテレータを使用する例です。
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo {
class Program {
public static IEnumerable<string> display() {
int[] arr = new int[] {99, 45, 76};
foreach (var val in arr) {
yield return val.ToString();
}
}
public static void Main(string[] args) {
IEnumerable<string> ele = display();
foreach (var element in ele) {
Console.WriteLine(element);
}
}
}
}
実行結果
99 45 76
コードの解説
上記の例では、イテレータメソッド display() が yield ステートメントを使って、配列の要素を1つずつ返しています。
public static IEnumerable<string> display() {
int[] arr = new int[] {99, 45, 76};
foreach (var val in arr) {
yield return val.ToString();
}
}
yield returnが実行されるたびに、現在の要素が呼び出し元へ返され、メソッドの実行状態は一時停止します。そして、次の要素が要求された時点で、ループの途中から処理が再開される仕組みです。
戻り値は IEnumerable<string> 型として受け取られ、foreach ループによって各要素を順番に取り出してコンソールに表示しています。
IEnumerable<string> ele = display();
foreach (var element in ele) {
Console.WriteLine(element);
}
押さえておきたいポイント
- イテレータは
yield returnを使って要素を1つずつ返す - 戻り値の型は
IEnumerable<T>またはIEnumerator<T>を指定する - 実行位置が記憶されるため、遅延評価(必要なときに必要な分だけ処理)が可能
- 全要素を一括でメモリに保持しないため、パフォーマンス面でも有利
-
Pythonでジェネレーターを使ってイテレーターを作成できる?yieldの基本と実装方法を解説
はい、Pythonではジェネレーターを使用してイテレーターを作成できます。ジェネレーターはyieldキーワードを使うことで簡単に定義でき、イテレーターとして振る舞う関数を宣言するための仕組みです。 Pythonのジェネレーターは、イテレーターを手軽に作成するためのシンプルな方法であり、主にイテレーターのように動作する関数を宣言する際に使われます。 ジェネレーターとは、一度に1つの値ずつ順番に取り出しながら反復処理(イテレーション)を行える関数のことです。日々のプログラミングでは、リスト、文字列、辞書(dict)などのイテラブルオブジェクトを頻繁に利用します。 イテレーターとは、ループ処理によっ
-
Pythonのitertoolsモジュールで効率的なイテレータを作成する方法
多くのプログラミング言語と同様に、Pythonにもwhile文とfor文というループ構造が用意されています。特にfor文は、リスト・タプル・文字列などのイテラブル(反復可能オブジェクト)を走査する際に非常に便利です。さらにPythonの標準ライブラリにはitertoolsモジュールがあり、より高速で効率的な反復処理ツールが定義されています。これらのイテレータ構成要素は、HaskellやSMLといった関数型プログラミング言語における類似ツールの「Pythonらしい(Pythonic)」実装です。 itertoolsモジュールの関数は3種類 itertoolsモジュールに含まれる関数は、以下の3つ