需要数组的可变函数的设计决策是什么?

时间:2009-07-14 17:08:42

标签: c# variadic-functions design-decisions variadic

我很好奇,希望有人可以对此有所了解 - 但为什么采用'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);

现在假设我想创建一个函数,它接收不同数量的Integer数组并总结所有数字。据我所知,我不得不考虑拳击......

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

2 个答案:

答案 0 :(得分: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;
}

您只需要添加一个数组数组。

答案 1 :(得分:0)

params被转换为单个对象,并且可以容纳集合的最低级别对象是一个数组。如果你想要一个带有可变数量的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;
}