2009-07-14 2 views
3

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

Теперь давайте говорить, что я хочу для создания функции, которая принимает различное количество массивов 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?

ответ

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

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

+0

Ah cool не знал этого, но почему это так, потому что это не массив массивов? Это скорее всего список массивов, почему не просто параметры Int32 для списка чисел, а параметры Int32 [] для массива? – 2009-07-14 17:18:16

+1

@Chalkey: да, это массив массивов. Если вы исследуете args в отладчике, он будет выглядеть так: args = {int [2] []}. Каждый элемент массива args является массивом int. –

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

Зачем использовать решение half-LINQ, если вы можете использовать решение full-LINQ - 'return data.Sum (array => array.Sum());'. –