LINQ to Object のイディオム その1 : Cast() と OfType()

昨日の LINQ to Object コードが読めなくなる前に(^^; メモを少し書き散らしておきます。

  • IEnumerable を LINQ to Object で扱うには Cast() か OfType() で IEnumerable に変換する。古くからある非ジェネリクスなコレクションを LINQ で扱うには変換必須。
  • Cast() と OfType() はどちらもシーケンスの各要素をキャストして列挙する
  • Cast() はそのままキャストするだけ。キャストできないと例外が飛ぶ。(パイプと例外は相性が悪いけど、それはまた別の話)
  • OfType() は is T だけ列挙する。is T でなければ飛ばす。IEnumerable シーケンスから T 型だけ抜き出すフィルタ。

実はこの違いはコード見れば一目で理解できるんですけどね(^^;

型混在のコレクションなんてあまり使わないので、Cast() を主に使うと思います。クエリ式では Cast が簡単に書けるようになっていて、昨日のコードの

from PropertyData p in mo.Properties

mo.Properties.Cast<PropertyData>()

に変換されます。

ヘジたんによる説明は このあたり