Frage

Ich habe eine Methode, wie:

AverageAndDoSomeMath (Point2)

, und ich frage mich, wie zu behandeln:

AverageAndDoSomeMath (Point2) // single
AverageAndDoSomeMath (Point2 collection) // multiple

vorzugsweise eine einzige Implementierung verwendet wird.

Sammlung, ich plane den IEnumerable-Typen zu verwenden, so dass ich jede Art von Sammlung passieren kann, aber für einen einzigen Wert, ich will nicht wickeln und es als eine Sammlung übergeben, weil die Sammlung selbst keinen Zweck dient, anders als die Art gerecht zu werden.

Wie man am besten damit umgehen in den klarsten, schnellste und effizienteste Weg?

EDIT: Vielleicht sollte ich eine bessere Methode Namen gewählt haben, aber die Methode berechnet den Durchschnitt aller Punkte, für 1 Wert, den es keinen Sinn macht, aber denken Sie daran, wie der Wert verwendet werden, berechnen zu sagen ein anderer Wert, aber was wichtig ist, ist die durchschnittliche finden, so kann ich nicht die erste Methode aufrufen.

War es hilfreich?

Lösung

Ich weiß, Sie sagen, Sie nicht, es wickeln wollten und es als eine Sammlung übergeben, aber es gibt zwei Möglichkeiten, wie Sie dies mit minimalem Aufwand zu tun, so dass ich sie im Fall schreibt Sie waren nicht bewusst ein .

Sie könnten params auf Ihrer Methode verwenden:

public void Average(params Point2[] points)

Danach können Sie es mit einer beliebigen Anzahl von Argumenten aufrufen, oder mit einem Array:

Average(P1);
Average(P2, P3, P4);
Average(); // this one becomes an empty array in the method

Point[] array = new Point[] { P1, P2, P3, P4 };
Average(array);

oder alternativ können Sie kurze Array-Syntax einpacken Ihr Objekt verwenden:

Average({ P1 }); // this is legal C# for making an array with 1 element

EDIT: Nach Ihrer Notiz zu lesen, würde ich vorschlagen, dass ein params Array der klarste Weg ist, zu tun, was Sie wollen. Der einzige wirkliche Nachteil ist es, dass Sie nicht in einem IEnumerable<Point2> (oder anderen Sammlungen wie ein List<Point2>) ohne ersten Aufruf ToArray() passieren können, denn es dauert nur tatsächliche Arrays.

Andere Tipps

zwei Methoden schreiben

  • AverageAndDoSomeMath (Point2 Punkt)
  • AverageAndDoSomeMath (IEnumerable Punkte)

und dem ersten einen Anruf der zweiten machen, indem sie es in einer Sammlung gewickelt wird.

public decimal AverageAndDoSomeMath (Point2 point)
{
    return AverageAndSomeMath(new []{point});
}

Ich vermute, dass das, was Sie schon im Sinn hatte, hielt es aber nicht die richtige Lösung war, nicht wahr?

Edit: Vereinfachte das Verfahren (dank Freddy Rios)

eine einzige Verantwortung pro Methode würde sagen, dass Ihre Methode nur eine Sache tun soll - das arithmetische Mittel berechnen - und das ist es. No "AndDoSomeOtherMath".

Und wenn man sich die Formel für die mittlere, können Sie sicherlich etwas Sinnvolles berechnen mit nur einem Punkt. Es ist die Standardabweichung, die zwei oder mehr erfordert.

Zu Ihrer Information können Sie einen Mittelwert und Standardabweichung im Fluge berechnen, ohne alle Werte speichern zu müssen. Es ist viel einfacher, auf das Gedächtnis. John D. Koch hat eine großer Blog-Artikel auf, wie es für die Standardabweichung zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top