Question

Je suis curieux et nous espérons que quelqu'un peut jeter somelight sur ce point - mais pourquoi les fonctions C # qui prennent « params » doivent être un tableau

?

Je reçois que les objets dans la liste des paramètres sont entrés dans un tableau, mais si quelqu'un veut créer une fonction qui prend variadique dans un nombre indéfini d'objets de tableau?

Prenez cette fonction par exemple ...

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

assez simple, il peut prendre une quantité différente de chiffres - par exemple ...

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

Maintenant, supposons que je veux créer une fonction qui prend une autre quantité de tableaux entiers et résume tous les numéros. Pour autant que je suis conscient que je dois considérer 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;
}

Ce qui pourrait alors être utilisé comme ...

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

Quel était le raisonnement derrière cela? Pourquoi était-ce pas toujours mis en œuvre comme une simple variable tableau unique non? Tels que params Int32?

Était-ce utile?

La solution

La fonctionnalité est déjà là, pas besoin de recourir à la 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;
}

Il vous suffit d'ajouter un tableau de tableaux.

Autres conseils

Les params se roulées en un seul objet, et l'objet de niveau le plus bas qui peut contenir une collection est un tableau. Si vous voulez une fonction qui prend un nombre variable de tableaux de ints, alors il doit être déclarée avec un tableau de tableaux int.

static int SumArrays(params int[][] data)
{
    int rval = 0;
    for (int i = 0; i < data.Length; i++)
    {
        rval += data[i].Sum();
    }
    return rval;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top