我正在使用DataTable并注意到Resharper建议我可以将循环转换为LINQ表达式。我这样做了,它在查询表达式语法(简化)中重写:
var test1 = from DataRow row in dt.Rows select row;
就个人而言,我更喜欢方法语法,所以重写它:
var test2 = dt.Rows.Select(row => row);
它破了。
'System.Data.DataRowCollection'不包含'Select'和no的定义 扩展方法'select'接受类型'System.Data.DataRowCollection'的第一个参数可以找到(你是否缺少using指令或汇编引用?)
由于查询表达式是translated to method calls,为什么第一个工作但不是第二个?我希望两者都可以或者两者都不起作用,这显然不是这样。
答案 0 :(得分:12)
第一个有一个显式类型的范围变量,因此它实际编译为:
var test2 = dt.Rows.Cast<DataRow>();
(不需要Select
,因为这是退化查询表达式(选择是无操作。)
另一种方法是从AsEnumerable
拨打DataTableExtensions
。我相信可能会有一些性能优势,但仅限于某些情况:
var test2 = dt.AsEnumerable();