下のコードは、最も初歩的なLINQのC#コードで、words Arrayの中で文字長5以下のものを表示するものです(各行の最初の数字は説明のために付加しました)。
1 string[] words = { “hello”, “wonderful”, “linq”, “beautiful”, “world” };
2 var shortWords =
3 from word in words
4 where word.Length <= 5
5 select word;
6 foreach (var word in shortWords)
7 Console.WriteLine(word);
ここで行番号3-5の部分がC#とは異なるLINQのquery expressionといわれるコードです。
コンパイラはこの部分を、一度次のようにC#のコードに変換します(勉強途中なので少し自信がないのですが)。
var shortWords =
words
.Where(word => word.Length <= 5)
.Select word;
ここに拡張C#の「暗黙に型付けされるローカル変数」、「拡張メソッド」、「ラムダ式」等の新機能が使われています。
さらにこのWhereやSelectが何者かというと、VS2008のオンラインヘルプではジェネリックとデリゲートを使って、次のように定義されています。
public static EnumerableRowCollection<TRow> Where<TRow>
this EnumerableRowCollection<TRow> source,
Func<TRow, bool> predicate
)
LINQの中でこの「ジェネリック デリゲート」が一番ややこしいと思います。その他の部分はそれなりの難しさがあるにしても、やることといえばSQL文とあまり変わりないのではないか。と考えています。
そして私が「ジェネリック デリゲート」についてとっつき難いと思ったのは、私がこれまでジェネリックやデリゲートを真剣に勉強しなかったからではなく、Net Framework 3.5(C#3.0、VB9.0)で初めて導入されたもので、分からなくて当然なのです。
「ジェネリック デリゲート」の説明はVS2008のオンラインヘルプの「Func(TResult)」にあります。これが一番いい資料だと思います。この部分を充分理解すれば、「ジェネリック デリゲート」はOKでしょう。そして「ジェネリック デリゲート」を理解すれば、LINQの根底の技術は理解できる。そしてC#の拡張機能だけで、LINQ機能を書く必要があっても問題なし。
そう考えています(今のところ)。