使用集合作为输入多次调用Action <t> </t>

时间:2014-12-03 12:50:49

标签: c# delegates action

我有一个非常标准的基准测试方法,它计算一个方法可以运行的次数,比如60秒:

    public static int BenchmarkTasks(Action<int> func, List<int> ids, int seconds)
    {
        var watch = new Stopwatch();
        var executionCount = 0;

        watch.Start();

        foreach (var id in ids)
        {
            if (watch.ElapsedMilliseconds / 1000 > seconds)
                return executionCount;

            func(id);
            executionCount++;
        }

        watch.Stop();

        return executionCount;
    }

但是,我正在试图弄清楚如何正确调用此方法 - 例如:

var ids = new List<int> {1, 2, 3};
BenchmarkHelper.BenchmarkTasks(delegate { MethodToBenchmark(-1); }, ids, 60);

只需运行方法MethodToBenchmark并将-1作为输入值(可以理解),它不会遍历我的ID集合。

任何人都可以让我知道我哪里出错了吗?当然,这只是我误解了如何做到这一点。

感谢。

3 个答案:

答案 0 :(得分:4)

您不需要delegate - 您只需要直接传递该方法即可。否则,您传递的Action每次都会调用MethodToBenchmark(-1)

这就是你应该怎么称呼它:

var ids = new List<int> {1, 2, 3};
BenchmarkHelper.BenchmarkTasks(MethodToBenchmark, ids, 60);

答案 1 :(得分:3)

您可以使用以下匿名方法调用它:

BenchmarkHelper.BenchmarkTasks((i) => MethodToBenchmark(i), ids, 60);

答案 2 :(得分:0)

使用lambda表达式传递参数:

BenchmarkHelper.BenchmarkTasks(id => MethodToBenchmark(id), ids, 60);