C# linq中lambda语法的类型声明

C# linq中lambda语法的类型声明,c#,linq,lambda,C#,Linq,Lambda,如何将类型声明插入lambda语法 汇编: from DataRow row in dataTable.Rows select transformOneRow(row) 不编译: dataTable.Rows.Select( r => transformOneRow(r)) 错误地 “System.Data.DataRowCollection”不包含“Select”的定义,并且找不到接受“System.Data.DataRowCollection”类型的第一个参数的扩展方法“Selec

如何将类型声明插入lambda语法

汇编:

from DataRow row in dataTable.Rows select transformOneRow(row)
不编译:

dataTable.Rows.Select( r => transformOneRow(r))
错误地
“System.Data.DataRowCollection”不包含“Select”的定义,并且找不到接受“System.Data.DataRowCollection”类型的第一个参数的扩展方法“Select”

我看到查询语法允许类型;这让编译器很高兴。
如何将类型声明插入lambda语法

我的方法是:

dataTable.AsEnumerable().Select(r => transformOneRow(r));
dataTable.Rows.Cast<DataRow>().Select(r => transformOneRow(r));
dataTable.Rows.OfType<DataRow>().Select(r => transformOneRow(r)); // Also does filtering on type.
dataTable.AsEnumerable().Select(r=>transformOneRow(r));
dataTable.Rows.Cast().Select(r=>transformOneRow(r));
dataTable.Rows.OfType()。选择(r=>transformOneRow(r));//还对类型进行过滤。
如何将类型声明插入lambda语法

编译器将把查询语法转换为方法语法。如果反编译代码,您将看到发出的IL调用
Enumerable.Cast

IL_0000:nop
IL_0001:newobj System.Data.DataTable..ctor
IL_0006:stloc.0//dataTable
IL_0007:ldloc.0//dataTable
IL_0008:callvirt System.Data.DataTable.get_行

IL_000D:call System.Linq.Enumerable.Cast您是否使用System.Linq添加了
?@shay\uuuuu是。关于发生的情况,请参见下面的答案。
IL_0000:  nop         
IL_0001:  newobj      System.Data.DataTable..ctor
IL_0006:  stloc.0     // dataTable
IL_0007:  ldloc.0     // dataTable
IL_0008:  callvirt    System.Data.DataTable.get_Rows
IL_000D:  call        System.Linq.Enumerable.Cast <--- This
IL_0012:  ldsfld      UserQuery+<>c.<>9__0_0
IL_0017:  dup         
IL_0018:  brtrue.s    IL_0031
IL_001A:  pop         
IL_001B:  ldsfld      UserQuery+<>c.<>9
IL_0020:  ldftn       UserQuery+<>c.<Main>b__0_0
IL_0026:  newobj      System.Func<System.Data.DataRow,System.Data.DataRow>..ctor
IL_002B:  dup         
IL_002C:  stsfld      UserQuery+<>c.<>9__0_0
IL_0031:  call        System.Linq.Enumerable.Select
IL_0036:  stloc.1     // result
IL_0037:  ret