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 指令或程序集引用?)

既然查询表达式被翻译成方法调用,为什么第一个有效而第二个无效?我希望两者都起作用或都不起作用,显然情况并非如此。

4

1 回答 1

12

第一个有一个显式类型的范围变量,所以它实际上被编译为:

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

(不需要,Select因为这是一个退化的查询表达式(选择是一个无操作。)

AsEnumerable另一种方法是从调用DataTableExtensions。我相信这可能会带来一些性能优势,但仅在某些情况下:

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