4

次の例では、どのようindexにしてその値を取得しますか?nはソースから自動的に取得されることは理解していますnumbersが、意味は明らかですが、インデックスにその値がどのように与えられるかはわかりません。

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);
4

3 に答える 3

4

このバージョンのTakeWhileは、シーケンス内のソース要素のインデックスを述語の2番目のパラメーターとして提供します。つまり、述語はpredicate(5、0)と呼ばれ、次にpredicate(4、1)、predicate(1、2)、predicate(3、3)などと呼ばれます。MSDNのドキュメントを参照してください。

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

于 2011-01-29T17:56:16.947 に答える
2

インデックスは、の実装によって生成されます。これは、このTakeWhileように見える場合があります。

于 2011-01-29T17:57:08.570 に答える
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++;
    }
}
于 2011-05-26T20:56:55.587 に答える