Каково было проектное решение для вариационных функций, нуждающихся в массиве?

StackOverflow https://stackoverflow.com/questions/1126740

Вопрос

Мне любопытно, и, надеюсь, кто-нибудь сможет пролить некоторый свет на это - но почему функции C #, которые принимают 'params', должны быть массивом?

Я понимаю, что объекты в списке параметров вводятся в массив, но что, если кто-то захочет создать переменную функцию, которая принимает неопределенное количество объектов массива?

Возьмем, к примеру, эту функцию...

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?

Это было полезно?

Решение

Функциональность уже есть, нет необходимости прибегать к боксу:

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

Вам просто нужно добавить к нему массив массивов.

Другие советы

Параметры объединяются в один объект, и объектом самого низкого уровня, который может содержать коллекцию, является массив.Если вам нужна функция, которая принимает переменное количество массивов целых чисел, то она должна быть объявлена как принимающая массив int-массивов.

static int SumArrays(params int[][] data)
{
    int rval = 0;
    for (int i = 0; i < data.Length; i++)
    {
        rval += data[i].Sum();
    }
    return rval;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top