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