« ADO.NET Entity Framework Beta 2 | メイン | PLINQ »

LINQ のクエリ式と foreach との対比

LINQ の話をすると出てくる質問。

例えばこんなサンプルで

class Program
{
    static void Main(string[] args)
    {
        List<string> nameList = new List<string>() { "Seo", "Tanaka", "Kato", "Sato" };

        var q = from n in nameList
                where n.StartsWith("S")
                select n;

        foreach (string n in q)
            Console.WriteLine(n);
        Console.ReadLine();
    }
}


「n って何?」(n って書かないとダメなの?もある)
「in の意味が分からない」
「from ~ where ~ select ~ の順番に意味があるの?」

ってな質問を受けました。

これの答えとしては、LINQ のクエリ式の部分をちょっと書き換え。

var q = new List<string>();
foreach (string n in nameList)
{
    if (n.StartsWith("S"))
        q.Add(n);
}

foreach を使ってみるとすっきりします。これなら直感的に理解できます。
(結果的に等価なロジックであって中間言語が同じになるという意味ではありません)

さっきの質問の答えは

「n ってコレクションの要素のこと」
「コレクションの要素をループするから in なんですよ」
「foreach と if とを入れ替えると意味が通らなくなるでしょ、それと同じ」

この程度のコードなら LINQ でも foreach でも大した違いはない(というかそっくりな構文)けど、複雑になってくると foreach で表現するのはかなり面倒。
それに対して LINQ ならシンプルで可読性が高いコードになりそうです。

About

2007年09月14日 01:26に投稿されたエントリーのページです。

ひとつ前の投稿は「ADO.NET Entity Framework Beta 2」です。

次の投稿は「PLINQ」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.34