2011-01-29 5 views
4

以下の例のindexはどのようにしてその値を取得しますか?ラムダ式の変数の値はどのように与えられますか

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 
var firstSmallNumbers = numbers.TakeWhile((n, index) => n >= index); 

TakeWhileのシグネチャは次のとおりです:

public static IEnumerable<TSource> TakeWhile<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate); 
+0

あなたはそれがうまく型付けされてどのように機能するかを尋ねる、またはTakeWhile'が定義されているか 'インデックス/の意味は何されています? – delnan

+0

@delnan:私はラムダに関する一般的な質問をしていると思っていましたが、回答に基づいて、TakeWhileがラムダをどのように使用しているかについて本当に質問していました。私は、nの型は数値のメンバの型から推論でき、インデックスの型はFunc によって定義されることを理解しています。 – Bill

答えて

4
私は意味が明確である一方で、私は、インデックスがその価値を与えているかを確認していない、nは自動的にソース numbersから得られることを理解しますが、

このバージョンのTakeWhileは、シーケンス内のソース要素のインデックスを、述語の第2パラメータとして提供します。私。述部は述部(5,0)、次に述部(4,1)、述部(1,2)、述部(3,3)などと呼ばれます。the MSDN documentationを参照してください。

また、関数の「より単純な」バージョンがあり、シーケンス内の値のみを提供します。MSDNを参照してください。

+0

ありがとうございました。TakeWhileがインデックスに値を提供しなければならないという私の質問を投稿した後に私に起こりました。私は、提供された値と一般的なラムダの使用法から推測された値を解析することに慣れています。 – Bill

2

インデックスはTakeWhileの実装によって生成されます。これはthisのように見えます。

1

物事は限り、あなたはTakeWhileを実現することができる方法を見つけ出すと明らかになって:

public static IEnumerable<TSource> TakeWhile<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate) 
{ 
    int index = 0; 
    foreach (TSource item in source) 
    { 
     if (predicate(item, index)) 
     { 
      yield return item; 
     } 
     else 
     { 
      yield break; 
     } 
     index++; 
    } 
} 
関連する問題