Pregunta

Soy curiosa y es de esperar que alguien pueda arrojar somelight en esto - pero ¿por qué hacer las funciones de C # que tienen '' params tiene que ser un array

?

consigo que los objetos en la lista de parámetros se introducen en una matriz pero lo que si alguien quiere crear una función variadic que lleva en un número indefinido de objetos de matriz?

Tome esta función, por ejemplo ...

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

bastante sencillo, se puede tomar en una cantidad diferente de los números - por ejemplo ...

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

Ahora digamos que quiero crear una función que toma en una cantidad diferente de matrices de enteros y resume todos los números. Por lo que yo soy consciente de que tendría que tener en cuenta el boxeo ...

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

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

que luego podría ser utilizado 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);

¿Cuál fue el razonamiento detrás de esto? ¿Por qué no fue esta vez implementado como una sola variable no matriz? Tal como params Int32?

¿Fue útil?

Solución

La funcionalidad ya está ahí, no hay necesidad de recurrir al boxeo:

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

Sólo tiene que añadir una matriz de matrices.

Otros consejos

Los params consiguen enrolladas en un solo objeto, y el objeto de nivel más bajo que puede contener una colección es una matriz. Si desea una función que toma un número variable de arrays de enteros, entonces debe ser declarado como tomar una matriz de matrices 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top