ジェネリック デリゲート

下のコードは、最も初歩的な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&ltTRow&gt Where&ltTRow&gt
   this EnumerableRowCollection&ltTRow&gt  source,
   Func&ltTRow, bool&gt predicate
)

LINQの中でこの「ジェネリック デリゲート」が一番ややこしいと思います。その他の部分はそれなりの難しさがあるにしても、やることといえばSQL文とあまり変わりないのではないか。と考えています。

そして私が「ジェネリック デリゲート」についてとっつき難いと思ったのは、私がこれまでジェネリックやデリゲートを真剣に勉強しなかったからではなく、Net Framework 3.5(C#3.0、VB9.0)で初めて導入されたもので、分からなくて当然なのです。

「ジェネリック デリゲート」の説明はVS2008のオンラインヘルプの「Func(TResult)」にあります。これが一番いい資料だと思います。この部分を充分理解すれば、「ジェネリック デリゲート」はOKでしょう。そして「ジェネリック デリゲート」を理解すれば、LINQの根底の技術は理解できる。そしてC#の拡張機能だけで、LINQ機能を書く必要があっても問題なし。

そう考えています(今のところ)。

error: コピーできません !!