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

Мне любопытно, и надеюсь, что кто-то может пролить некоторый свет на это - но почему функции 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?

Ответы [ 2 ]

3 голосов
/ 14 июля 2009

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

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

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

0 голосов
/ 14 июля 2009

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

static int SumArrays(params int[][] data)
{
    int rval = 0;
    for (int i = 0; i < data.Length; i++)
    {
        rval += data[i].Sum();
    }
    return rval;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...