LINQ - 方法与查询语法的区别

Les*_*ter 9 c# linq linq-query-syntax linq-method-syntax

我正在使用DataTable并注意到Resharper建议我可以将循环转换为LINQ表达式.我这样做了,它在查询表达式语法(简化)中重写:

var test1 = from DataRow row in dt.Rows select row;
Run Code Online (Sandbox Code Playgroud)

就个人而言,我更喜欢方法语法,所以重写它:

var test2 = dt.Rows.Select(row => row);
Run Code Online (Sandbox Code Playgroud)

它打破了.

'System.Data.DataRowCollection'不包含'Select'的定义,也没有扩展方法'Select'接受类型为'System.Data.DataRowCollection'的第一个参数'(你是否缺少using指令或程序集引用) ?)

由于查询表达式被转换为方法调用,为什么第一个工作但不是第二个?我希望两者都可以或者两者都不工作,这显然不是这样.

Jon*_*eet 12

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

var test2 = dt.Rows.Cast<DataRow>();
Run Code Online (Sandbox Code Playgroud)

(没有必要,Select因为这是一个简并查询表达式(select是一个无操作.)

另一种方法是打电话AsEnumerableDataTableExtensions.我相信可能会有一些性能优势,但仅限于某些情况:

var test2 = dt.AsEnumerable();
Run Code Online (Sandbox Code Playgroud)

  • 这是必要的,因为`DataRowCollection`实现了'IEnumerable`,而不是`IEnumerable <T>`. (2认同)