Pergunta

Estou curioso e espero que alguém pode lançar somelight sobre isso - mas por que as funções C # que levam 'params' tem que ser um array

?

Eu recebo que os objetos na lista de parâmetros são inseridos em uma matriz, mas o que se alguém quer criar uma função de aridade variável que leva em um número indefinido de objetos de matriz?

Tome esta função, por exemplo ...

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

bastante simples, pode levar em uma quantidade diferente de números - por exemplo ...

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

Agora, vamos dizer que eu quero criar uma função que leva em uma quantidade diferente de arrays de inteiros e resume todos os números. Tanto quanto eu estou ciente de que eu teria que considerar boxe ...

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

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

O que pode então ser usada como ...

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 foi o raciocínio por trás disso? Por que não foi isso nunca implementado como apenas uma única variável não matriz? Tais como params Int32?

Foi útil?

Solução

A funcionalidade já está lá, sem necessidade de recorrer ao 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;
}

Você só precisa adicionar um array de arrays.

Outras dicas

Os parâmetros se enrolada em um único objeto, e o objeto de nível mais baixo que pode conter uma coleção é uma matriz. Se você quer uma função que recebe um número variável de conjuntos de ints, então ele deve ser declarada como recebendo uma matriz de matrizes int.

static int SumArrays(params int[][] data)
{
    int rval = 0;
    for (int i = 0; i < data.Length; i++)
    {
        rval += data[i].Sum();
    }
    return rval;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top