ページ

2006年2月10日金曜日

C# 3.0 の Extension Method と Lambda Expression

Neighbourhood super-hero LINQ comes to the rescue より


object[] list = { 1, 2, "abhinaba", 5f, "basu" };

 

foreach( var v in list.Where(x => x is string))

{

Console.WriteLine(v);


いい感じです。
ところで、この場合の var の型は何になるんでしょう?「x is string」 を評価した結果は string にしかなりえないからちゃんと string になるんでしょうか?それとも x は object だから var も object になるんでしょうか?

3 件のコメント:

  1. objectになるようですね。ちなみにselectで型を指定するとstringに出来ます。

    返信削除
  2. ありがとうございます。


    やっぱり object ですか。select まで書けば型を指定できるというのは納得です。

    返信削除
  3. お久しぶりです。 


    コメント遅くなってしまいましたが、non-generic IEnumerable の場合

    OfType<T> Operatorを使っていただければ、Compilerが型を推論できるようになります。


    object[] list = { 1, 2, "abhinaba", 5f, "basu" };

    foreach( var v in list.OfType<string>()) {...}


    のように書いていただければ、Whereと同じ事が出来ます。


    OfType<T>はWeakly Typed SequenceをStrongly Typed Sequenceに変えると同時にコンパイラに型を伝えたい場合に便利です。たとえば、


    from e in new EventLog("Application").Entries

    where e.Source=="Hoge"

    select e;


    はコンパイラエラーになってしまいますが、


    from e in new EventLog("Application").Entries.OfType<EventLogEntry>()

    where e.Source=="Hoge"

    select e;


    はOKです。


    返信削除