Domanda

Sono curioso e si spera che qualcuno possa fare somelight su questo - ma perché le funzioni C # che prendono 'params' deve essere un array

?

Mi capita che gli oggetti nella lista dei parametri vengono inseriti in una matrice, ma cosa succede se qualcuno vuole creare una funzione variadic che prende in un numero indefinito di oggetti array?

Prendete questa funzione per esempio ...

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

piuttosto semplice, si può prendere in una diversa quantità di numeri - per esempio ...

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

Ora Diciamo che voglio creare una funzione che prende in una diversa quantità di array intero e riassume tutti i numeri. Per quanto ne so avrei dovuto prendere in considerazione la boxe ...

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

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

che potrebbe poi essere usato come ...

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

Qual è stato il ragionamento dietro questo? Perché non è stato mai questo implementato come una sola variabile non array? Come ad esempio params Int32?

È stato utile?

Soluzione

La funzionalità è già lì, non c'è bisogno di ricorrere alla boxe:

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

Hai solo bisogno di aggiungere che un array di array.

Altri suggerimenti

I params vengono laminati in un unico oggetto, e l'oggetto di livello più basso che può contenere una collezione è un array. Se si desidera una funzione che prende un numero variabile di array di int, allora dovrebbe essere dichiarato come l'assunzione di un array di array int.

static int SumArrays(params int[][] data)
{
    int rval = 0;
    for (int i = 0; i < data.Length; i++)
    {
        rval += data[i].Sum();
    }
    return rval;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top