9

私は DataTable を扱っていて、Resharper がループを LINQ 式に変換できることを推奨していることに気付きました。私はそうしましたが、クエリ式の構文(簡略化)で書き直されました:

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

個人的には、メソッドの構文が好きなので、次のように書き直しました。

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

そして壊れた。

'System.Data.DataRowCollection' には 'Select' の定義が含まれておらず、タイプ 'System.Data.DataRowCollection' の最初の引数を受け入れる拡張メソッド 'Select' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか? ?)

クエリ式はメソッド呼び出しに変換されるため、最初の式は機能するのに 2 番目の式は機能しないのはなぜですか? 両方が機能するか、どちらも機能しないことを期待していましたが、明らかにそうではありません。

4

1 に答える 1

12

最初のものには明示的に型指定された範囲変数があるため、実際には次のようにコンパイルされます。

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

Select(これは退化したクエリ式であるため、必要はありません(select はノーオペレーションです)。

AsEnumerable別の方法として、 fromを呼び出すこともできますDataTableExtensions。これにはいくつかのパフォーマンス上の利点があると思いますが、一部の場合のみです。

var test2 = dt.AsEnumerable();
于 2012-02-29T16:26:30.743 に答える