2012-02-29 43 views
9

DataTableで作業していて、ResharperがループをLINQ式に変換することを推奨していることに気付きました。私はそのようにしたし、それが(簡体字)クエリ式の構文で書き直されました:LINQ - メソッドとクエリの構文の違い

var test2 = dt.Rows.Select(row => row); 

そして、それは破った:

var test1 = from DataRow row in dt.Rows select row; 

個人的に、私はこれにそれを書き直したメソッドの構文を好みます。

「System.Data.DataRowCollection」タイプ「System.Data.DataRowCollection」の最初の引数を受け入れる「を選択」「選択」の定義なし 拡張メソッドが含まれていませんが見つけることができる(あなたが不足しています使用するディレクティブまたはアセンブリ参照?)

クエリ式はtranslated to method callsなので、なぜ最初のものは動作しますが、2番目のものはありませんか?私はどちらかあるいはどちらも、明らかにそうではないことを期待していました。

答えて

12

それが実際にコンパイルされますので、最初は、明示的に型指定された範囲の変数を持っています

var test2 = dt.Rows.Cast<DataRow>(); 

選択は何もしません(これは縮退クエリ式あるようSelectの必要はありません( 。)

代替DataTableExtensionsからAsEnumerableを呼び出すことで、私はそれではなく、唯一のいくつかのケースで一部パフォーマンス上の利点があるかもしれないと考えている:。

var test2 = dt.AsEnumerable(); 
+2

これは 'DataRowCollection'が' IEnumerable 'ではなく' IEnumerable'を実装しているので必要です。 –

+1

@ChrisShouts:ああ、私はこれに気付いたことがありますが、決してまったく正確につぶれませんでした。 「間違った」IEnumerableを実装しているという事実は、私が見逃していたものです。 :) – Chris

関連する問題