Frage

Ich bin gespannt, und hoffentlich kann jemand somelight auf diesem verschütten - aber warum die C # Funktionen tun, die nehmen ‚params‘ muss ein Array sein

?

ich, dass die Objekte in der Parameterliste werden in ein Array eingegeben, aber was ist, wenn jemand will eine variadische Funktion erstellen, die in einer nicht definierten Anzahl der Array-Objekte nehmen?

Nehmen Sie diese Funktion zum Beispiel ...

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

ziemlich geradlinig, kann es in einer unterschiedlichen Menge von Zahlen nehmen - zum Beispiel ...

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

Jetzt können sagen, dass ich eine Funktion erstellen möchten, die in einer unterschiedlichen Menge von Integer-Arrays nimmt und fasst alle Zahlen. Soweit ich weiß, ich würde Box haben zu prüfen, ...

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

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

die dann verwendet werden könnte, wie ...

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

Was war der Grund? Warum war das nicht immer nur als ein einziger nicht Array-Variable implementiert? Wie params Int32?

War es hilfreich?

Lösung

Die Funktionalität ist schon da, keine Notwendigkeit, Boxen zu greifen:

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

Sie müssen es einfach nur ein Array von Arrays hinzuzufügen.

Andere Tipps

Die params zu einem einzigen Objekt gerollt werden, und das niedrigste Ebene Objekt, das eine Sammlung halten kann, ist ein Array. Wenn Sie eine Funktion mögen, die eine variable Anzahl von Arrays von Ints nimmt, dann sollte es als Einnahme ein Array von int Arrays deklariert werden.

static int SumArrays(params int[][] data)
{
    int rval = 0;
    for (int i = 0; i < data.Length; i++)
    {
        rval += data[i].Sum();
    }
    return rval;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top