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 ならシンプルで可読性が高いコードになりそうです。