调用函数直到一个人在C#中遇到条件

时间:2012-06-20 07:08:29

标签: c#

我有一个调用函数的代码,直到满足条件,但我不是处于非常提前的阶段所以代码,我一点也不清楚。在这里,我将提交我得到的代码......请有人讨论代码如何工作。

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参数但是当这个函数被调用时,许多参数正在传递....我只是不了解函数的调用。请讨论谢谢。

3 个答案:

答案 0 :(得分:5)

这有几个部分,我可以看到为什么新手可能会发现这个代码有点难以理解。

首先,该方法不使用2个参数,第二个标记为params,这意味着将任意数量的参数传递给此方法,除了第一个参数之外的所有参数都作为数组发送到参数{ {1}}(进一步阅读the C# params keyword)。

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

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

通过一个例子,大致基于你自己:

match

步骤1,2&amp; 3将执行(3是第一个返回false),然而4&amp; 5不会。

答案 1 :(得分: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

接下来你有了一个 param array 函数,每个函数都给你一个T param数组是你可以提供多个函数的原因。

Any是一个很好的技巧:这将通过你提供的函数(在param数组中),对它们进行评估,然后用哨兵检查结果。如果哨兵说真的任何停止,那么这个功能完全按照它说的那样。

答案 2 :(得分:2)

第二个参数params Func<T>[] functions实际上意味着“允许许多Func<T>作为后续参数传递,并将它们呈现在一个名为functions的数组中。”这是由params keyword

引起的

因此,当你打电话

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