加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 22:19:13 所属栏目:百科 来源:网络整理
导读:如何将类型声明插入lambda语法? 编译: from DataRow row in dataTable.Rows select transformOneRow(row) 不编译: dataTable.Rows.Select( r = transformOneRow(r)) 有错误 ‘System.Data.DataRowCollection’不包含’Select’的定义,也没有扩展方法’Sel
如何将类型声明插入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子句之前.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读