Linq Select方法将Func作为输入参数。这意味着我可以在Select的选择器中有多个语句,例如
var myresult = sources.Select(s =>
{int x; if (s.val = high) {x=1} else if (s.val = med) {x=2} else {x=3}; return x;
}
)
如何使用Linq查询语法
执行此操作var myresult = from s in sources
select ...
这里,Func部分中的代码(if ... else if .. else)是人为的。我真正想知道的是select子句的语法,可以将其描述为
select select-expression
的语法是什么?
选择表达
答案 0 :(得分:2)
我不想在我的代码中看到你的第一个版本。如果你需要在lambda中拥有基本上是一个完整的函数,我宁愿看到lambda只是调用一个完整的函数!换句话说......
theQuery.Select(s => GetX(s)); // just define a GetX function
这也是查询表达式语法的直接翻译
from s in sources
select GetX(s);
您将无法将完整的代码块放入查询表达式语法中。你可以把你给定的逻辑翻译成可用的东西(但是很麻烦),但是我很确定你的代码片段只是一个普遍的例子。如果不随便改变,你可以尝试
select s.val == high ? 1 : (s.val == med ? 2 : 3); // totally messy
答案 1 :(得分:0)
这是不可能的。
如果你真的想,你可以用匿名方法创建一个Func<T>
并调用它,但那会很糟糕。
答案 2 :(得分:0)
使用if/else
等效的switch
语句代替特殊大小值,对您的值进行分组和过滤更加符合Linq:
var myResult = from s in sources
group by s.val into g
select new { Val = g.Key, Sources = g };
var groupHigh = myResult.Where(i => i.Val == high);
var groupMedium = myResult.Where(i => i.Val == medium);
var groupOther = myResult.Except(groupHigh.Concat(groupMedium));
请注意,我提供的代码只是一个起点,并不是实现特定目标的最佳方式。我可以通过以下方式之一解决这个问题:
group by
的使用方式(使用SomeFunction(s.Val)
而不是直接使用s.Val
)答案 3 :(得分:0)
MSDN表示 select 是C#4.0的上下文关键字。所以我检查了C#语言规范4.0。其选择条款部分(7.16.2.5)指定
形式的查询表达式
from x in e select v
被翻译成
( e ) . Select ( x => v )
除非v是标识符x,否则翻译只是
( e )
结果,
的语法选择select-expresion
select-expression 应该是选择方法中可用作TResult的任何内容。因此,使用选择方法中的匿名Func可能无法使用 select子句来实现功能。
结论是你应该坚持使用Method语法,因为这就是代码真正在场景后面运行的方式。