C# 入門

ホーム > LINQ > LINQ シンタックス - 拡張メソッドとクエリ表現

LINQ シンタックス - 拡張メソッドとクエリ表現

LINQ クエリの書き方、フォーマットには何種類かあります。

書き方は違えど同じ意味のクエリーに対しては、コンパイラが同等のコードを生成するので、フォーマットだけでは実行性能には影響しません。

しかしながら、ソフトウェアの開発サイクル全体を考えれば、実行時のことばかり考えていられないですよね。

コードの読みやすさ、明快さは非常に大切です。

特に他人のコードを読むときなどは、しっかり書かれていないと生産性が上がりません。

このため、ここでは LINQ のシンタックス、二種類紹介しますが、混ぜこぜで使うというのではなく、統一された方法でコードを書くべきです。 どちらを使うかは自分の好み、会社のスタンダードなどで選べばよいと思います。

LINQ シンタックス

クエリ表現フォーマット

SQL を知っている人がクエリを分かりやすく記載できるようにするため、LINQ ではクエリ表現フォーマットがあります。

using System;
using System.Linq;

namespace Linq1
{
  class Program
  {
    static void Main(string[] args)
    {
      var names = new string[] {
        "Taro Yamada", 
        "Hanako Yamada", 
        "Ichiro Suzuki"
      };

      Console.WriteLine("--- Query 1 Extension Method ---");

      var q1 = from n in names
           where n.Contains("Yamada")
           select n;

      foreach (var s in q1)
      {
        Console.WriteLine("{0}", s);
      }
  }
}

実行結果は次の通り。

--- Query 1 Query Format ---
Taro Yamada
Hanako Yamada

ポイントは次の箇所です。

      var q1 = from n in names
           where n.Contains("Yamada")
           select n;

データベースの一般的なクエリ文では、SELECT-FROM-WHERE という順番ですが、 LINQ では FROM-WHERE-SELECT という順番になります。

拡張メソッドフォーマット

C# の拡張メソッドを利用する方法です。

具体例は次の通りです。

using System;
using System.Linq;

namespace Linq1
{
  class Program
  {
    static void Main(string[] args)
    {
      var names = new string[] {
        "Taro Yamada", 
        "Hanako Yamada", 
        "Ichiro Suzuki"
      };

      Console.WriteLine("--- Query 2 Query Format ---");

      var q2 = names.Where(n => n.Contains("Yamada"));

      foreach (var s in q2)
      {
        Console.WriteLine("{0}", s);
      }

    }

    static bool foo(string s) {
      return s.Contains("Ichiro");
    }
  }
}

実行結果は次の通りです。

--- Query 2 Extension Method ---
Taro Yamada
Hanako Yamada

この例では人の名前を要素に持つ文字列 string のコレクションの中から、特定の条件(ここでは "Yamada" という文字を含む)に合致する string 要素を取り出します。

Where という拡張メソッドが条件を受け取り、それが true の要素のみをフィルターして返しています。

条件の指定は、ここではラムダ式を利用しています。が、 ラムダ式を使うのは必須ではなく、次のように Func デリゲートを明示的に利用することもできます。

using System;
using System.Linq;

namespace Linq1
{
  class Program
  {
    static void Main(string[] args)
    {
      var names = new string[] {
        "Taro Yamada", 
        "Hanako Yamada", 
        "Ichiro Suzuki"
      };

      Console.WriteLine("--- Query 3 Extension Method ---");

      var q3 = names.Where(foo);

      foreach (var s in q3)
      {
        Console.WriteLine("{0}", s);
      }

    }

    static bool foo(string s) {
      return s.Contains("Ichiro");
    }
  }
}

実行結果は次の通り。

--- Query Extension Method ---
Ichiro Suzuki

要素のフィルターを行う Where 拡張メソッドで、ラムダ式を書く代わりに、フィルター条件を決めるメソッドがセットされています。

ホーム > LINQ > LINQ シンタックス - 拡張メソッドとクエリ表現