LinQ的不同形式

Jos*_*ggs 2 c# linq

string grid = @"08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08";
string[] res = grid.Split(' ');

var lowNums = from n in res
              where n.Length > 0
              select int.Parse(n);
Run Code Online (Sandbox Code Playgroud)

我无法将上述linQ语句转换为lambda WHERE等效语句.以下工作,但只返回上午,enumernable<string>而我想要一个enumerable<int>:

IEnumerable<string> all = res.Where(x => x.Length > 0);
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 10

我无法将上述LINQ语句转换为lambda Where()等效.

您想要做的是仔细阅读C#规范的第7.16.2节.它将引导您逐步完成整个过程.

它说:

带有where子句的查询表达式

from x in e
where f
...
Run Code Online (Sandbox Code Playgroud)

被翻译成

from x in ( e ) . Where ( x => f )
...
Run Code Online (Sandbox Code Playgroud)

所以你的查询

from n in res  
where n.Length > 0  
select int.Parse(n);  
Run Code Online (Sandbox Code Playgroud)

被翻译成

from n in (res).Where(n=>n.Length > 0)
select int.Parse(n)
Run Code Online (Sandbox Code Playgroud)

这是翻译的第一阶段.现在再回到规范:

表单的查询表达式

from x in e select v
Run Code Online (Sandbox Code Playgroud)

被翻译成

( e ) . Select ( x => v )
Run Code Online (Sandbox Code Playgroud)

所以你翻译过的一次查询

from n in (res).Where(n=>n.Length > 0)
select int.Parse(n)
Run Code Online (Sandbox Code Playgroud)

进一步翻译成

((res).Where(n=>n.Length > 0)).Select(n=>int.Parse(n))
Run Code Online (Sandbox Code Playgroud)

现在它不再是一个查询表达式,所以不再进行语法翻译.


jjn*_*guy 9

以下应该有效.你刚忘了这个select条款.

res.Where(n => n.Length > 0).Select(n => int.Parse(n));
Run Code Online (Sandbox Code Playgroud)

where条款不会将您的数据更改为int.但是,Select(lambda)可以.


Ree*_*sey 5

您需要包含对int.Parse的调用以将结果转换为int.由于你在"where"子句之后执行此操作,这将需要一个Select(),它基本上允许您更改可枚举的形式(即:将其映射到新类型,在这种情况下,从字符串转换为INT):

var lowNums = res.Where(n => n.Length > 0).Select(n => int.Parse(n));
Run Code Online (Sandbox Code Playgroud)