LINQをやるぞ!

LINQをやるぞ!
使う資料はC#3.0の仕様書です。プリント版がAddison-Wesleyから発売、フリーのWordフォーマットがMSDNに落ちています。
普通にC#勉強したい人はどっかから本買ってきてください。Java経験者なら割と楽です。C++経験しているとさらに楽でしょう。

では、さっそく

p.223の7.15のQuery ExpressionがC#LINQにあたる部分です。

Query expressions provide a language integrated syntax for queries that is similar to relational and hierarchical query languages such as SQL and XQuery.

文法規則が書いてあるので、示された規則の中で構文が最小のもの構成にすると、以下のような式をかけばとりあえずOKになりそう。

from <identifier> in <expression> select <expression>
from
Each from clause is a generator introducing a range variable which ranges over the elements of a sequence.
select
select or group clause specifies the shape of the result in terms of the range variables.

じゃ、簡単な例からいってみよう!

            List<String> list = new List<string>();
            list.Add("apple computer");
            list.Add("microsoft");
            list.Add("sunmicrosystems");
            list.Add("ibm");

            var hoge = from a in list select a + " = " + a;

            foreach(string a in hoge){
                Console.WriteLine(a); // それぞれ "apple computer = apple computer"...と表示される
            }

メモ


query-expression:
from-clause query-body
from-clause:
from type(opt) identifier in expression
query-body:
query-body-clauses(opt) select-or-group-clause query-continuation(opt)
query-body-clauses:
query-body-clause
query-body-clauses query-body-clause
query-body-clause:
from-clause
let-clause
where-clause
join-clause
join-into-clause
orderby-clause
let-clause:
let identifier = expression
where-clause:
where boolean-expression
join-clause:
join type(opt) identifier in expression on expression equals expression
join-into-clause:
join type(opt) identifier in expression on expression equals expression into identifier
orderby-clause:
orderby orderings
orderings:
ordering
orderings , ordering
ordering:
expression ordering-direction(opt)
ordering-direction:
ascending
descending
select-or-group-clause:
select-clause
group-clause
select-clause:
select expression
group-clause:
group expression by expression
query-continuation:
into identifier query-body