3

私は興味があり、うまくいけば誰かがこれに光を当てることができます-しかし、なぜ「params」を取るC#関数は配列でなければならないのですか?

パラメータリストのオブジェクトが配列に入力されていることはわかりましたが、未定義の数の配列オブジェクトを受け取る可変引数関数を作成したい場合はどうすればよいでしょうか?

たとえば、この機能を...

private Int32 Sum(params Int32[] numbers)
{
    return numbers.Sum(); // Using LINQ here to sum
}

非常に簡単ですが、さまざまな量の数値を受け取ることができます-たとえば...

Int32 x = Sum(1);
Int32 y = Sum(1, 2);
Int32 z = Sum(1, 2, 3);

ここで、さまざまな量の整数配列を取り、すべての数値を合計する関数を作成したいとします。私の知る限り、ボクシングを検討する必要があります...

private Int32 SumArrays(params Object[] numbers)
{
    Int32 total = 0;
    foreach (Object o in numbers)
    {
        Int32[] array = (Int32[])o;

        total += array.Sum();
    }
    return total;
}

これは次のように使用できます...

Int32[] arr1 = new Int32[] { 1, 2, 3 };
Int32[] arr2 = new Int32[] { 1, 2, 3, 4 };
Int32[] arr3 = new Int32[] { 1, 2, 3, 4, 5 };

Int32 x = SumArrays((Object)arr1, (Object)arr2);
Int32 y = SumArrays((Object)arr1, (Object)arr2, (Object)arr3);

この背後にある理由は何でしたか? なぜこれが単一の非配列変数として実装されなかったのですか? のようなparams Int32

4

2 に答える 2

3

機能はすでに存在するため、ボクシングに頼る必要はありません。

private int SumAll(params int[][] args)
{
    int result = 0;
    for (int x = 0; x < args.Length; x++)
    {
        for (int y = 0; y < args[x].Length; y++)
        {
            result += args[x][y];
        }
    }
    return result;
}

配列の配列に追加するだけです。

于 2009-07-14T17:16:20.393 に答える
0

パラメータは単一のオブジェクトにまとめられ、コレクションを保持できる最下位レベルのオブジェクトは配列です。可変数の int 配列を受け取る関数が必要な場合は、int 配列の配列を受け取る関数として宣言する必要があります。

static int SumArrays(params int[][] data)
{
    int rval = 0;
    for (int i = 0; i < data.Length; i++)
    {
        rval += data[i].Sum();
    }
    return rval;
}
于 2009-07-14T17:18:01.123 に答える