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

Chapter16 LINQとメソッド構文

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

16.10 メソッド構文のクエリの接続

 ここでは別の形で、クエリ式とはガラッと雰囲気の変わるメソッド構文を紹介しよう。

 前章の「15.13 クエリの接続」では、into句を用いて2つのクエリを接続した例を紹介した(リスト16.12参照)。

using System;
using System.Linq;

class Program
{
  static void Main(string[] args)
  {
    var query = from n in Enumerable.Range(1, 10)
                select n * n into m
                where m > 50 select m;

    foreach (int n in query) Console.WriteLine(n);
  }
}
リスト16.12 1から10までの整数を2乗した値のうち50を超える数値のみを抽出

 これは、メソッド構文ではどのように記述すればよいのだろうか?

 where句にはWhereメソッド、select句にはSelectメソッドがあったように、into句にはIntoメソッドがあるのだろうか? 結論からいうと、Intoメソッドは存在しない。なぜなら、「列挙できるものはクエリできるもの」という原則からいえば、そもそも、into句がなくてもクエリを記述できるからだ。たとえば、リスト16.12のクエリは、次のように書き直せばinto句抜きで記述できる。

var query = from m in (
                from n in Enumerable.Range(1, 10) select n * n)
            where m > 50 select m;

 ただし、これは「2つのクエリ式」を含む式となる。into句は、これを「1つのクエリ式」で表現するために使われるものである。

 さて、これをメソッド構文に置き換えるとき、式は全体で1つの式となるため、“1つの”、“2つの”という区別は意味がなくなる。つまり、into句の存在意義そのものが消滅してしまう。

 そして、「列挙できるものはクエリできるもの」という原則からいえば、Selectの出力は「列挙」であるから、これを入力として直接Whereメソッドの前段階に接続してよい。つまり、上記のクエリは次のようなシンプルな1本の式に書き換えられる。

var query = Enumerable.Range(1, 10)
            .Select((n) => n * n)
            .Where((m) => m > 50)
            .Select((m) => m);

 さらにいえば、実はWhereメソッドの返却値そのものが「列挙」であるため、同じ値を列挙させる効能しか発揮していない最後の「.Select((m) => m)」はなくても結果は変わらない。

 つまり、次の記述だけで、同等の結果が得られる。

var query = Enumerable.Range(1, 10)
            .Select((n) => n * n)
            .Where((m) => m > 50);

 このことは、本章p.300で紹介したメソッド構文の「array.Select((x) => x);」という式でも“Select((x) => x)”はなくても同じであることを示す。

 このように、クエリ式とは別の形の最適化、シンプル化を行うことができるのが、メソッド構文の特徴といえる。


 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#プログラミング」


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 記事ランキング

本日 月間