C# の LINQ の二つのシンタックス

C# の LINQ とは

LINQ というのは Language Integrated Query の頭文字をとった言葉で 「リンク」と読みます。

SQL のクエリー文のような表記をプログラミング言語に組み込むものでデータ操作をより簡単に直感的に行うために作られたものです。

言語にクエリーを組み込むことで、各種データベースのみならず、XML ファイルやメモリ上の配列などに対しても、 一貫した方法でデータ操作できるようになります。

LINQ のクエリシンタックス

SQL に似た表記でデータ操作を可能とするためのシンタックスとして、LINQ にはクエリシンタックス (Query Syntax) があります。

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 という順番になります。

LINQ のメソッドシンタックス

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 拡張メソッドで、ラムダ式を書く代わりに、フィルター条件を決めるメソッドがセットされています。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 C# 入門