4

int 配列を操作するメソッドのパフォーマンス測定を行いたいので、次のクラスを作成しました。

public class TimeKeeper
{
    public TimeSpan Measure(Action[] actions)
    {
        var watch = new Stopwatch();
        watch.Start();
        foreach (var action in actions)
        {
            action();
        }
        return watch.Elapsed;
    }
}

しかしMeasure、以下の例ではメソッドを呼び出すことができません:

var elpased = new TimeKeeper();
elpased.Measure(
    () =>
    new Action[]
        {
            FillArray(ref a, "a", 10000),
            FillArray(ref a, "a", 10000),
            FillArray(ref a, "a", 10000)
        });

次のエラーが表示されます。

Cannot convert lambda expression to type 'System.Action[]' because it is not a delegate type
Cannot implicitly convert type 'void' to 'System.Action'
Cannot implicitly convert type 'void' to 'System.Action'
Cannot implicitly convert type 'void' to 'System.Action'

配列で機能するメソッドは次のとおりです。

private void FillArray(ref int[] array, string name, int count)
{
    array = new int[count];

    for (int i = 0; i < array.Length; i++)
    {
        array[i] = i;
    }

    Console.WriteLine("Array {0} is now filled up with {1} values", name, count);
}

私が間違っていることは何ですか?

4

2 に答える 2

10

Measureは、最初の引数がAction[]を返すラムダではなく、 であると想定していますAction[]また、アクション配列は、実際に呼び出し ているときにデリゲートを渡すことを期待していますFillArray

おそらくこれが必要です:

elpased.Measure
(
    new Action[]
    {
        () => FillArray(ref a, "a", 10000),
        () => FillArray(ref a, "a", 10000),
        () => FillArray(ref a, "a", 10000)
    }
);
于 2012-06-09T22:23:12.070 に答える
0

タイプ 'void' を 'System.Action' に暗黙的に変換することはできません

この配列初期化子は、メソッドActionによって返された sで配列を埋めることが期待されていますが、そうではありません。FillArray

new Action[]
        {
            FillArray(ref a, "a", 10000),
            FillArray(ref a, "a", 10000),
            FillArray(ref a, "a", 10000)
        });

それに応じて を変更して、代わりにFillArrayを返しますActionvoid

于 2012-06-09T22:36:24.307 に答える