3

条件を満たすまで関数を呼び出すためのコードを取得しましたが、非常に進んだ段階ではないため、コードがまったく明確ではありませんでした。ここで私が得たコードを提出します...コードがどのように機能するかについて誰かが詳細に議論してください。

public static void RunToFirstMatch<T>(Func<T, bool> sentry, params Func<T>[] functions)
{
     functions.Any(f => match(f()));
}

コードは次のように呼び出されます

RunToFirstMatch(v => (v >= 5), Step1, ()=>Step2(1,1), Step3, Step4, ()=>0+1);

RunToFirstMatch関数は 2 つの引数を取りますが、この関数が呼び出されると、多くの引数が渡されます....私は関数の呼び出しについて理解していません。ありがとうございます。

4

3 に答える 3

5

これにはいくつかの部分があり、初心者がこのコードを理解するのが少し難しいと思う理由がわかります。

まず、メソッドは2つの引数を取りません。2番目はマークされますparams。これは、任意の数のパラメーターがこのメソッドに渡され、最初のパラメーターを除くすべてが引数に配列として送信されることを意味します( C#キーワードfunctionsをさらに読みます)。params

次に、メソッドは、メソッドの1つがtrueを返すまで、列挙可能なもの(引数など)を列挙するIEnumerable<T>拡張メソッドを使用します。Anyfunctions

次に、いくつかのパラメーターが混同されていると思います。に変更sentryしたと思います。配列の各関数が実行され、その結果が関数に渡されるとmatch仮定すると(trueまたはfalseが返されます)。最初にtrueを返すと、メソッドは終了します。functionsmatch

したがって、例として、大まかにあなた自身に基づいて:

RunToFirstMatch(v => (v >= 5), // match
                  () => 1, () => 4, () => 9, () => 20, () => 40); //function(s)

ステップ1、2、および3は実行されます(3が最初にfalseを返します)が、4および5は実行されません。

于 2012-06-20T07:18:44.467 に答える
3

あるべきだと思うので、コードにわずかなエラーがあると思います

public static void RunToFirstMatch<T>(Func<T, bool> sentry, params Func<T>[] functions)
{
     functions.Any(f => sentry(f()));
}

しかし、ステップバイステップで行きましょう:

セントリーは、(タイプTの)入力に基づいて何かが真であるかどうかを判断する述語です-これは関数に最初に与えるものです-あなたの例ではこれはv >= 5-ですので、intを取ると思います(あなたからは明確ではありません例-たとえば、doubleの場合もあります)、それが5より大きいかどうかを確認します

次に、それぞれがそのようなTを与える関数のparam配列を取得しました。param配列は、複数の関数を与えることができる理由です。

Anyは素晴らしいトリックです。これは、提供された関数(param配列内)を調べ、それらを評価してから、歩哨に結果を確認します。歩哨がtrueと言った場合、停止するので、関数はそれが言っていることを正確に実行します。

于 2012-06-20T07:20:20.500 に答える
2

2番目の引数、はparams Func<T>[] functions、実際には「多くFunc<T>のsを後続の引数として渡して、それらを。という配列で提示できるようにする」ことを意味しfunctionsます。これは、paramsキーワードが原因で発生します。

したがって、あなたが呼び出すとき

RunToFirstMatch(v => (v >= 5), Step1, ()=>Step2(1,1), Step3, Step4, ()=>0+1)

あなたが得る

sentry = v => (v >= 5); /* or should this be called match? */
functions = new Func<T>[]
    {
        Step1,
        ()=>Step2(1,1),
        Step3,
        Step4,
        ()=>0+1
    };
于 2012-06-20T07:16:35.090 に答える