C#のyield returnとyield breakの使い方

C#にはたくさんのメソッドがあります。今回は、その中でもとても理解しやすくわかりやすいといわれるyield returnについて紹介します。この処理はreturnメソッドを使っている人におすすめの処理です。
今までこういったことで困ったことはないでしょうか。
- プログラマー
- returnメソッドを使っているけど、値を返して処理が終わります。本当はそのまま続けて値を返したいものがあるのですが……
- プロジェクト
リーダー - メソッドのreturn命令は値を返したらそれで終わってしまいますね。実はreturn命令ではなくyield returnというイテレーター(メソッド)を使うとその時々に値を返せるので問題は解決しますよ。
yield returnとは?イテレーターを理解しよう
yield returnの見た目はメソッドと一緒ですが、「イテレーター(メソッド)」に定義されます。イテレーターとは英語で繰り返しを意味します。プログラム言語によってイテレーターの解釈が違います。
C#では列挙子と呼ばれ、IEnumeratorによってあらわされます。イテレーターを使用することでコレクションクラスに対し要素を列挙することができるようになります。
C#のイテレーターは簡単にいうと、foreach命令で処理できるコレクションを生成するためのメソッドということになります。
イテレーターの戻り値
イテレーターの戻り値は、system.Collections.Generic.IEnumerator、またはIEnumerable型とします。
enumerateは「列挙する」という意味で、IEnumerator/IEnumerable型は「コレクションに対する反復処理を可能にする」ための型です。Tには、yield return命令で返す値の型を指定します。
yield returnの例文
とてもシンプルな例文です。一つずつ理解していましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using System; using System.Collections; using System.Collections.Generic; class Test { // イテレーターを定義 public static IEnumerable<string> GetStrings() { yield return "ABC"; yield return "DEF"; yield return "GHI"; } static void Main() { foreach(var str in GetStrings()) { Console.WriteLine(str); } Console.ReadKey(); } } |
実行結果
1 2 3 |
ABC DEF GHI |
yield returnはただのreturnと同じくメソッドの値を呼び出し元に返します。しかし、return命令がその場で関数の実行を終了するのに対して、yield return命令は一時的に停止するだけです。
つまり次に呼び出されたときには、その時点から処理を再開できます。
7 8 9 10 11 12 |
Public string Getstrings() { return "ABC"; return "DEF"; return "GHI"; } |
このように書くと‘ABC’が実行され‘DEF’‘GHI’は実行されません
定義されたイテレーター Getstringsをforeachルームに渡し、yield return命令をすることで「ABC」「DEF」「GHI」が順に返されるというわけです。
yield breakとは?
yield return命令はメソッドをそのまま終了させることができません。
途中でメソッドを終了させたい場合はyield break命令を使用します。
yield breakの例文
次のコードでは、yield breakを使って処理を終了させています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using System; using System.Collections; using System.Collections.Generic; class Test { // イテレーターを定義 public static IEnumerable GetIterator() { for(int a = 0; true; a++) { if(a == 2) yield break; yield return a; } } } static void Main() { foreach(object b in GetIterator()) { Console.WriteLine(b); } Console.ReadKey(); } } |
実行結果
1 2 |
0 1 |
- プログラマー
- yield breakを使えば、このように処理を終了させることができるのですね。
- プロジェクト
リーダー - yield returnとyield breakはセットで覚えることが重要なのでしっかりと理解して使いこなしていくことが大切です。
こうすることによって順に値を返すプログラムを書くことができるんですね
yield return を使うことでメソッドの繰り返し処理をより視覚的に使うことができます
yield returnは初心者でも使いやすいので挑戦してみよう!
yield returnは他のメソッドと見た目が同じでプログラムの流れもreturn文とあまり変わりません。使いやすく処理の幅が拡がりますのでぜひ挑戦してみましょう。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


C#新着案件New Job
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅)システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅)デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅)デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅)基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅)基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)