1

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の参照

Int32 パラメータのない Enumerable.Where メソッド

Int32 パラメーターを持つ Enumerable.Where メソッド

4

2 に答える 2

3

いいえ、できません。クエリ構文は、使用可能な操作のサブセットのみをサポートします。query-syntax の何ものも、 のそのオーバーロードにコンパイルされません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ください (残念ながら、これを行うのに役立つオーバーロードには同じ問題があります)。次に、クエリ構文でフィルターおよびその他のダウンストリーム操作を実行します。

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;
于 2012-12-16T16:06:38.727 に答える
1

いいえ、クエリ構文を使用して のそのオーバーロードWhere()(または同様の のオーバーロード)を呼び出す方法はありません。Select()

C# 4.0 仕様の §7.16.2.4 から:

where句を含むクエリ式

from x in e
where f
…

に翻訳されます

from x in ( e ) . Where ( x => f )
…
于 2012-12-16T16:00:33.247 に答える