Lassen Sie uns zunächst erklären, um Ihre berechnen() -Methode wie folgt aus:
int Calculate(IEnumerable<double> doubles)
Keine Sorge, Sie noch ein Array an diesem Code weitergeben können. Möglicherweise benötigen Sie auch IList<double>
, aber 9 von 10 Fällen ist IEnumerable gut genug. Die Hauptsache ist, dass wir das yield
Schlüsselwort verwenden läßt Ihre Array auf eine effiziente Art und Weise zu zerschneiden:
public static IEnumerable<T> Slice(this T[,] values)
{
return Slice(values, 0, 0);
}
public static IEnumerable<T> Slice(this T[,] values, int index)
{
return Slice(values, 0, index);
}
public static IEnumerable<T> Slice(this T[,] values, int dimension, int index)
{
int length = values.GetUpperBound(dimension);
int[] point = new int[values.Rank];
point[dimension] = index;
dimension = 1 - dimension;// only works for rank == 2
for (int i = 0; i < length; i++)
{
point[dimension] = i;
yield return (T)values.GetValue(point);
}
}
Es braucht noch etwas Arbeit, weil es nur mit Rang 2 Arrays funktioniert, aber es sollte in Ordnung sein das Beispiel, das du gepostet hast.
Jetzt können Sie Ihre berechnen Funktion wie folgt aufrufen:
Calculate(myArray.Slice(0));
Beachten Sie, dass aufgrund der Art und Weise IEnumerable und die Ausbeute Erklärung der im Code für Schleife arbeiten ich gepostet im Wesentlichen frei. Sie wird nicht ausgeführt, bis Sie die Elemente in Ihrer Calculate-Methode tatsächlich iterieren, und selbst dort wird "Just-in-Time" ausgeführt, sodass der gesamte Algorithmus O (n) bleibt.
Es wird noch interessanter, wenn Sie teilen, was Ihre Calculate-Methode macht. Sie können es möglicherweise als einfachen Aggregat + Lambda-Ausdruck ausdrücken. Zum Beispiel, sagen wir mal, Ihre berechnen Methode die Anzahl der Elemente> 5 zurückgegeben:
myArray.Slice(0).Count(x => x > 5);
Oder sagen, es summiert alle Elemente:
myArray.Slice().Sum();
Ich bin gespannt, was Ihre Berechnungsmethode tut. Ich wette, wir könnten es als Lambda-Ausdruck verwenden, indem Sie eine IEnumerable-Aggregat-Erweiterung verwenden. –