を使用yield
して、任意のイテレータを構築できます。これは、一連の遅延評価 (たとえば、一度にすべてを読み取らずにファイルまたはデータベースから行を読み取るため、メモリに保持するには多すぎる可能性があります) である可能性や、List<T>
.
C# in Depthには、反復子ブロックに関する無料の章 (6)があります。
私は最近、スマート ブルート フォース アルゴリズムの使用についてブログを書きました。yield
遅延ファイル リーダーの例:
static IEnumerable<string> ReadLines(string path) {
using (StreamReader reader = File.OpenText(path)) {
string line;
while ((line = reader.ReadLine()) != null) {
yield return line;
}
}
}
これは完全に「怠け者」です。列挙を開始するまでは何も読み取られず、1 行だけがメモリに保持されます。
LINQ-to-Objects では反復子ブロック ( ) が広範囲にyield
使用されることに注意してください。たとえば、Where
拡張子は基本的に次のとおりです。
static IEnumerable<T> Where<T>(this IEnumerable<T> data, Func<T, bool> predicate) {
foreach (T item in data) {
if (predicate(item)) yield return item;
}
}
繰り返しますが、完全に怠惰です。すべてを強制的にメモリにロードすることなく、複数の操作を連鎖させることができます。