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 个参数,第二个被标记params,这意味着将任意数量的参数传递给该方法,除了第一个参数之外的所有参数都作为数组发送到参数functions(进一步阅读C#params关键字)。

接下来,该方法使用枚举任何可枚举(例如参数)的IEnumerable<T>扩展方法,直到其中一个方法返回 true。Anyfunctions

我认为您随后混淆了一些参数,我认为您已更改sentrymatch,并假设发生的情况是functions执行数组中的每个函数,并将结果传递给match函数(将返回 true 或 false)。第一个返回true,方法退出。

所以举个例子,大致基于你自己的:

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()));
}

但让我们一步一步来:

sentry 是一个谓词,它根据它的输入(T 类型)决定是否为真 - 这是你给函数的第一件事 - 在你的例子中这是v >= 5- 所以我想它需要一个 int (从你的不清楚示例 - 例如也可以是双精度数)并检查它是否大于 5

接下来你得到一个函数的参数数组,每个函数都给你这样一个 T 参数数组就是为什么你可以提供多个函数的原因。

Any 是一个不错的技巧:这将通过您提供的函数(在 param 数组中),评估它们,然后与哨兵检查结果。如果哨兵说真的任何停止,那么函数就会完全按照它所说的那样做。

于 2012-06-20T07:20:20.500 回答
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 回答