我对LINQ中的棘手问题有疑问(几乎对我来说很棘手!)。
可以编写以下linqQuery
string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
var linqQuery= digits.Where((digit, index) => digit.Length < index);
使用Enumerable.Where<TSource>(IEnumerable<TSource>, Func<TSource, Int32, Boolean>)
Enumerable重载方法,使用查询语法
var linqQuery = from ...
where ...
select ...;
方法Enumerable.Where<TSource>(IEnumerable<TSource>, Func<TSource, Int32, Boolean>)
使用Int32
参数作为源元素的索引,我想知道是否可以从查询语法推断出此方法,而不是其他Enumberable重载方法Enumerable.Where<TSource> Method (IEnumerable<TSource>, Func<TSource, Boolean>)
这里是MSDN引用
答案 0 :(得分:3)
不,这是不可能的。查询语法仅支持可用操作的子集。查询语法中的任何内容都不会编译为Where
的重载。
你拥有的一切都很好。下面是一些查询语法的想法,可以让你编写这样的操作:
var linqQuery = from d in digits.Where((digit, index) => digit.Length < index)
// You can do more stuff here if you like
select d;
还考虑首先投射到包含索引的类型(Select
重载将帮助您执行此操作具有相同的问题,不幸的是)然后在查询语法中执行过滤器和其他下游操作: / p>
var linqQuery = from tuple in digits.Select((digit, index) =>
new { Digit = digit, Index = index })
where tuple.Digit.Length < tuple.Index
// You can do more stuff here if you like
select tuple.Digit;
还要考虑moreLinq的SmartEnumerable
,这样可以省去投射到元组的麻烦:
var linqQuery = from tuple in digits.AsSmartEnumerable()
where tuple.Value.Length < tuple.Index
// You can do more stuff here if you like
select tuple.Value;
答案 1 :(得分:1)
不,没有办法使用查询语法调用Where()
的重载(或Select()
的类似重载)。
来自C#4.0规范的§7.16.2.4:
带有
where
子句的查询表达式from x in e where f …
被翻译成
from x in ( e ) . Where ( x => f ) …