|  |  | 
 
| 連載:[完全版]究極のC#プログラミングChapter4 Findメソッド川俣 晶2009/09/14
 |  | 
| 
 | 
4.2 ForEachメソッドのbreak問題
 前章では、foreach文を使うよりも、System.Arrayクラスやジェネリックコレクションのクラスなどが持つForEachメソッドを使うほうが高速でお薦めだと書いた。
 しかし、これは単に置き換えればよいというものではない。実際には置き換えられない事例があるからだ。
 たとえば、次のリスト4.1はそのままForEachメソッドに書き換えられない。
| 
 
| using System;
 class Program
 {
 static void Main(string[] args)
 {
 string[] 玉電駅名 = {
 "下高井戸","七軒町","六所神社前","山下","豪徳寺前","宮ノ坂"
 };
 
 foreach (string 駅名 in 玉電駅名)
 {
 if (駅名.Contains("前"))
 {
 Console.WriteLine(
 "前の付く駅名としては、たとえば{0}があります。", 駅名);
 break;
 }
 }
 
 // 出力:前の付く駅名としては、たとえば六所神社前があります。
 }
 }
 
 |  | 
| リスト4.1 ForEachメソッドに書き換えられない例 | 
 試しに、リスト4.1をForEachメソッドを使うように書き換えてみたのがリスト4.2である。
| 
 
| using System;
 class Program
 {
 static void Main(string[] args)
 {
 string[] 玉電駅名 = {
 "下高井戸","七軒町","六所神社前","山下","豪徳寺前","宮ノ坂"
 };
 
 Array.ForEach(玉電駅名, (駅名)=>
 {
 if (駅名.Contains("前"))
 {
 Console.WriteLine(
 "前の付く駅名としては、たとえば{0}があります。", 駅名);
 break;
 }
 });
 }
 }
 
 |  | 
| リスト4.2 実際にはコンパイルできない書き換え | 
 しかし、このソースは「break;」の行で次のようなエラーになり、コンパイルできない。
| 
 
| エラー  1   break または continue に対応するループがありません。    d:\w\test\ConsoleApplication4\ConsoleApplication4\Program.cs    17  17  ConsoleApplication4
 
 |  | 
| リスト4.2のコンパイル時に表示されるエラー | 
 コンパイルできない理由は明らかで、breakはループを脱出する文であるにもかかわらず、このソースにはループ(foreach/or/while/do)がないからである。
 実はForEachメソッドを使うと、break/continue/return文は機能しなくなってしまう。return文の機能はcontinue文相当になり、break/continue文は使用することができない。
 しかし、break文などでループを脱出するのは常識的に多用されるテクニックである。それが使えないとしたら、非常に問題が大きい。だが、foreach文抜きのプログラミングを行っていても、さほど困らない。
 それはなぜだろうか?
 
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間