連載:[完全版]究極のC#プログラミング

Chapter16 LINQとメソッド構文

川俣 晶
2010/03/29
Page 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

16.6 メソッド構文でのみ可能なクエリ

 さて、すでに説明したとおり、クエリ式は糖衣構文であり、実体としての本体はメソッド構文となる。このことは、メソッド構文が用意されていても、糖衣構文が用意されていない機能は、クエリ式では記述できないことを意味する。

 具体的な例を1つ紹介しよう(後でもう1つ紹介する)。

 ここで取り上げるのはソースの順序を逆転する「Reverseメソッド」である。最初の項目が最後になり、最後の項目が最初になる。まず、これを単体で使った例を紹介しておこう(リスト16.7参照)。

using System;
using System.Linq;

class Program
{
  static void Main(string[] args)
  {
    int[] array = { 1, 2, 3 };

    foreach (var n in array.Reverse())
    {
      Console.WriteLine(n);
    }
    // 出力:
    // 3
    // 2
    // 1
  }
}
リスト16.7 ソースの順序を逆転する

 「これが本当にクエリの機能か?」と疑問を持った読者もいると思うが、これはメソッド構文のクエリの中で使用する、れっきとしたクエリ関連の機能である。

 たとえば、「守」という文字を含む名前のリストを抽出し、リストの最後の2人だけを取り出す処理を記述してみよう。ここで難しいのは、列挙において「最後の2つ」を抜き出す処理である。最後の1つを抜き出すだけならLastメソッドという便利なメソッドがあるのだが、いつ列挙が終わるか回数を事前に予測できないので、最後から2つ目の項目を、その項目が列挙された時点で確定するのは難しい。強いて書くなら、つねに列挙された最新の2つの項目を保持し続ける仕掛けを組み込む必要がある。

 しかし、列挙の順番を逆転させると、比較にならないぐらい簡単になる。要するに、最初の2つを取り出せば、それが最後の2つなのである。このような処理は、Reverseメソッドが使用できるメソッド構文では容易に記述できる(リスト16.8参照)。

using System;
using System.Linq;

class Program
{
  static void Main(string[] args)
  {
    string[] array = { "押井守", "細田守", "神戸守", "湯山邦彦" };

    var query = array.Where((n) => n.Contains('守')).Reverse();

    int count = 0;
    foreach (var name in query)
    {
      Console.WriteLine(name);
      count++;
      if (count >= 2) break;
    }
    // 出力:
    // 神戸守
    // 細田守
  }
}
リスト16.8 「守」を含む名前のリストを抽出し、リストの最後の2人だけを取り出す


 INDEX
  [完全版]究極のC#プログラミング
  Chapter16 LINQとメソッド構文
    1.16.1 予約語のエスケープ
    2.16.2 メソッド構文のLINQ
    3.16.3 クエリ式とメソッド構文の違い
    4.16.4 絞り込みと結果の生成
    5.16.5 最初の事例の別解
  6.16.6 メソッド構文でのみ可能なクエリ
    7.16.7 メソッド構文のソート
    8.16.8 orderbyの比較オブジェクト
    9.16.9 メソッド構文の複数のソースからクエリする
    10.16.10 メソッド構文のクエリの接続
    11.16.11 クエリ結果のグループ化
    12.16.12 メソッド構文で複数のソースを関連付ける
    13.16.13 メソッド構文のグループ化結合
    14.16.14 メソッド構文の左外部結合
    15.16.15 メソッド構文のlet句/【Exercise】練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」

@IT Special

- PR -

TechTargetジャパン

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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る

ホワイトペーパーTechTargetジャパン

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH