連載:[完全版]究極の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文抜きのプログラミングを行っていても、さほど困らない。

 それはなぜだろうか?


 INDEX
  [完全版]究極のC#プログラミング
  Chapter4 Findメソッド
    1.4.1 MATステートメントの思い出
  2.4.2 ForEachメソッドのbreak問題
    3.4.3 ForEachだけではない繰り返しメソッド
    4.4.4 複数の結果がほしい場合
    5.4.5 偉大なる前進とは何か?
    6.4.6 そして、LINQへ続く/【Exercise】練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間