LINQ和Enumerable.Where <tsource>(IEnumerable <tsource>,Func <tsource,int32,=“”boolean =“”>)重载方法</tsource,> </tsource> </tsource>

时间:2012-12-16 15:55:17

标签: c# linq

我对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引用

Enumerable.Where method without Int32 parameter

Enumerable.Where method with Int32 parameter

2 个答案:

答案 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;

还要考虑moreLinqSmartEnumerable,这样可以省去投射到元组的麻烦:

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 )
…