|
|
連載:[完全版]究極の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 記事ランキング
本日
月間