2022年01月10日
川俣晶の縁側ソフトウェアnew_C#入門・全キーワード明快解説! total 486 count

yield: 列挙可能なメソッドを自作しよう

Written By: 川俣 晶連絡先

この章のテーマ §

 yield return文、yield break文、列挙オブジェクトについて学びます。

前提知識 §

Console.WriteLineメソッド, 変数の基礎, メソッドの基礎, 条件演算子, int型, foreach文, ジェネリック

解説 §

 foreach文などで列挙できる対象は、通常配列などのコレクションです。

 しかし、列挙機能は簡単に自作できます。

 以下の条件を満たすメソッドを書くだけです。

  • 戻り値の型がIEnumerable<T> (Tは列挙する値の型)
  • yield return文で列挙する値を伝える
  • 途中で打ち切る時はyield breakを呼ぶ

 サンプルソースのDoubleCountメソッドは、この機能を用いて、1から順に2倍ずつ増えていく値を列挙します。そして、100を超えたらそこで列挙を打ち切ります。

罠の数々 §

  • この機能は実際にはSyntax Sugar(実際には存在しないが、ソースコード上では存在するように見せかける機能)である。そのため、一部の機能で制限を受けることがある。たとえば、in、ref、out パラメーターは使用できない
  • 正攻法でIEnumerable<T>インターフェースを実装するという実現方法もあるが、手間が掛かるのであまり見かけない

参考リンク §

反復子 (C#)

サンプルソース: kw_yield §

foreach (var item in DoubleCount())

{

    Console.WriteLine(item);

}

IEnumerable<int> DoubleCount()

{

    int a = 1;

    for(; ; )

    {

        if (a > 100) yield break;

        yield return a;

        a *= 2;

    }

}

実行結果 §

1

2

4

8

16

32

64

リポジトリ §

https://github.com/autumn009/CSharpPrimer2

練習問題 §

 以下のプログラムの実行結果を予測してみよう。

int yield = 1;

Console.WriteLine(yield);

  1. yieldは予約語だからエラーになる
  2. 列挙を始めてしまい、1,2,3……を出力する
  3. 1
  4. yieldのあとにreturnを書き足せば動く
  5. yieldのあとにbreakを書き足せば動く

[[解答]]

単行本情報