0

このサンプルは、名前がその値よりも短い数字を返す、インデックス付きの Where 句を示しています。ソースコード

public void Linq5() 
{ 
    string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; 

    var shortDigits = digits.Where((digit, index) => digit.Length < index); 

    Console.WriteLine("Short digits:"); 
    foreach (var d in shortDigits) 
    { 
        Console.WriteLine("The word {0} is shorter than its value.", d); 
    } 
}

今私の質問は...次のようなLINQクエリ形式でこれを書くことができますか?

from u in digits where u.Length>index select u;

上記のクエリから INDEX 値を取得するにはどうすればよいですか?

4

2 に答える 2

1

いいえ、オーバーロードWhereされた演算子はクエリ構文では使用できません。msdnからの引用は次のとおりです。

クエリ式の構文では、where (Visual C#) または Where (Visual Basic) 句は、次の呼び出しに変換されます。 Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)

インデックスを手動で導入できます:

int index = 0;
var query = from u in digits 
            where u.Length > index++ 
            select u;

ただし、各クエリを呼び出す前に手動でインデックスをリセットする必要があることに注意してください。とにかく - インデックスが必要な場合は、流暢な API が最適です。

var query = digits.Where((u, i) => u.Length > i); 

使わない理由が見当たりません。

于 2012-12-20T10:00:37.963 に答える
0

これを試して:

string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };

var shortDigits = from pair in digits.Select((digit, index) => new { digit, index })
              where pair.digit.Length < pair.index
              select pair.digit;
于 2012-12-20T10:08:44.583 に答える