ページ

2010-06-08

C#勉強中 C# 3.0 入門 7

C# 3.0 入門の続き
  • 第7回 LINQ応用編
    応用編の最初はLINQ式のデバッグの話。LINQ式に限りませんが、複雑な機能を実現するような文はどれでもデバッグが大変になります。結合を使いまくったSQL文なんかもトラブった時には目も当てられません(ので複雑なSQL文はなるべく避けるようにしています)。ただここに記載されているようにLINQ式の場合、式全体、where句、select句のそれぞれのレベルでブレークポイントを設定できるので、障害解析は随分と楽になっています。
    次の話題は前章で予告していたjoinの使い方色々。機能的はSQLでおなじみの機能で、グループ化結合、左外部結合が挙げられています。後々の参考のために、それぞれのjoin句の形式をまとめておきましょう。
    内部結合 from x in s1
    join y in s2 on x.key equals y.key
    select new {Name = x.Name, Value = y.Value }
    グループ結合 from x in s1
    join y in s2 on x.Key equals y.Key into s3
    select new {Name = x.Name, Values = s3 }
    左外部結合 from x in s1
    join y in s2 on x.Key equals y.Key into s3
    from z in s3.DefaultIfEmpty(Default)
    select new {Name = x.Name, Value = z }
    DefaultIfEmptyは列挙の対象が空だった場合にデフォルト値を割りつけるための関数で列挙データを扱う時に何かと役に立ちますね。
    次の話題はlet句。LINQの列挙の結果(途中)を保持する識別子を作成する機能のようです。ここで例に挙がっているケースでは、複数のfrom句の途中で一旦列挙(に対する計算結果)を保持して、最後のselect句で参照しています。複数のfrom句を使うと、それらの列挙の直積に対してselectが実行されるため、計算負荷が増大することがあります。一部のfrom句に対してlet句で処理を実行し、その結果を保持することによって計算負荷を軽減しています。このようなケースはままありますので、負荷軽減の手法として覚えておくのもいいかと思います。
    次の話題はquery式のインスタンス化。Query式を括弧で括ってインスタンスとして取り扱う技法です。インスタンス化して、インスタンスメソッドを呼び出すことによって、列挙に対する標準的な操作を行なうことができるようになります。ここでは、ToArrayによる(列挙の)配列化、Countによる個数のカウント、存在チェックのAny、が例として挙げられているます。ただ、query式のインスタンス化は式を一旦列挙の変数で受け取って、その変数をインスタンスとして扱っても同じ結果になります。文字列の生成の例では、
    static void Main(string[] args)
        {
            IEnumerable<char> q = from n in Enumerable.Range('A', 26)
                                  where (n % 2) == 0
                                   select (char)n;
            string s = new string(q.ToArray());
            Console.WriteLine(s); // 出力:DFHJLNPRTVXZ
        }
    でも同じ結果が得られます。そういう意味ではある種の省略記法に過ぎないのかも知れません。
    LINQには、このような式としての記述の他にメソッド表記なるものがあるそうで、次回はその説明になるようです。

0 件のコメント:

コメントを投稿