微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 在lambda语法中输入linq中的声明

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

编译:

from DaTarow row in dataTable.Rows select transformOneRow(row)

不编译:

dataTable.Rows.Select( r => transformOneRow(r))

错误
‘System.Data.DaTarowCollection’不包含’Select’的定义,也没有扩展方法’Select’接受类型为’System.Data.DaTarowCollection’的第一个参数’

我看到查询语法允许一个类型;这让编译器感到高兴.
如何将类型声明插入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.

解决方法

How do I insert the type declaration into the lambda Syntax?

编译器将查询语法转换为方法语法.如果您对代码进行反编译,您将看到发出的IL调用Enumerable.Cast< T>:

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

因此,正如您所做的那样,等效的是调用Enumerable.Cast< DaTarow>在您的查询中,在Select子句之前.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐