static void Main(string[] args) { DateTime d = DateTime.Now; foreach (var i in f(1, 10)) { Console.WriteLine((DateTime.Now - d).Seconds.ToString()); if (i == 3) { break; } } Console.ReadLine(); } static List<int> f(int s, int e) { List<int> result = new List<int>(); for (int i = s; i <= e; i++) { // 重い処理があるとする Thread.Sleep(1000); result.Add(i); } return result; }
実行結果
10 10 10
static void Main(string[] args) { DateTime d = DateTime.Now; foreach (var i in f(1, 10)) { Console.WriteLine((DateTime.Now - d).Seconds.ToString()); if (i == 3) { break; } } Console.ReadLine(); } static IEnumerable<int> f(int s, int e) { for (int i = s; i <= e; i++) { // 重い処理があるとする Thread.Sleep(1000); yield return i; } }
実行結果
1 2 3
breakが使えないのでループを終了判定の渡し方を用意しておかないといけない。
static void Main(string[] args) { DateTime d = DateTime.Now; f(1, 10, delegate(int i) { Console.WriteLine((DateTime.Now - d).Seconds.ToString()); return (i == 3); }); Console.ReadLine(); } static void f(int s, int e, Func<int, bool> func) { for (int i = s; i <= e; i++) { // 重い処理があるとする Thread.Sleep(1000); if (func(i)) { break; } } }
実行結果
1 2 3