2009-03-02 7 views
2

Ich habe eine Methode wie:Umgang mit einzelnen und mehreren Werte in C# Methoden effektiv

AverageAndDoSomeMath (Point2) 

und ich frage mich, wie zu handhaben:

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

vorzugsweise eine einzige Implementierung verwendet wird.

Für die Sammlung, ich plane, den IEnumerable-Typ zu verwenden, so kann ich jede Art von Sammlung übergeben, aber für einen einzelnen Wert möchte ich nicht als Sammlung umleiten und übergeben, da die Sammlung selbst keinen Zweck erfüllt , außer um den Typ zu erfüllen.

Wie man es am besten auf die klarste, schnellste und effizienteste Weise behandelt?

EDIT: Vielleicht hätte ich einen besseren Methodennamen wählen sollen, aber die Methode berechnet den Durchschnitt aller Punkte, für 1 Wert macht es keinen Sinn, aber denken Sie daran, dass der Wert verwendet wird, um zu sagen berechne einen anderen Wert, aber was wichtig ist, ist den Durchschnitt zu finden, also kann ich nicht die erste Methode nennen.

Antwort

9

Ich weiß, Sie sagten, Sie nicht, es wickeln wollte und es als eine Sammlung übergeben, aber es gibt zwei Möglichkeiten, wie Sie dies tun können, mit minimaler Aufwand, also poste ich sie, für den Fall, dass du dir eines nicht bewusst bist.

Sie params auf Ihrer Methode verwenden:

public void Average(params Point2[] points) 

nach dem Sie es mit einer beliebigen Anzahl von Argumenten aufrufen kann, 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 kurz verwenden Array-Syntax einpacken Ihre Aufgabe:

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

EDIT: Nachdem ich Ihre Notiz gelesen habe, würde ich vorschlagen, dass ein Parameter-Array der klarste Weg ist, um das zu tun, was Sie wollen. Der einzige wirkliche Nachteil ist, dass Sie keine IEnumerable<Point2> (oder andere Sammlungen wie List<Point2>) übergeben können, ohne zuerst ToArray() aufzurufen, da es nur tatsächliche Arrays benötigt.

+0

Danke Ich kannte den letzten nicht. Btw der Parameter ist ausschließlich für Arrays, oder? Nicht Listen usw.? –

+0

Das ist richtig, das ist eine Schande, aber so ist das Leben. – mquander

+0

Ich wusste nie über das Schlüsselwort params, das ist großartig. – mbillard

9

schreiben zwei Methoden

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

und der 1. ein Aufruf an die zweite machen, indem sie es in einer Sammlung Einwickeln .

Ich vermute, das ist, was Sie bereits im Sinn hatten, dachte aber, es war nicht die richtige Lösung, oder?

Edit: Vereinfachte Verfahren (dank Freddy Rios)

+0

Danke, aber ich denke nicht, dass das funktioniert. Hinzugefügt mehr Details. –

+0

Es müsste vielmehr andersherum funktionieren, wo der erste den zweiten aufruft, indem er ihn in eine Sammlung einpackt. – mquander

+0

Ja, die einzelne Methode muss die Erfassungsmethode aufrufen. – mbillard

1

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

Und wenn Sie die formula für den Mittelwert betrachten, können Sie sicherlich etwas Sinnvolles mit nur einem Punkt berechnen. Es ist Standardabweichung, die zwei oder mehr erfordert.

FYI, Sie können eine mittlere und Standardabweichung im laufenden Betrieb berechnen, ohne alle Werte speichern zu müssen. Es ist viel einfacher im Speicher. John D. Cook hat eine great blog article wie man es für die Standardabweichung macht.

+0

Danke, ja, diese Methode war nur ein Beispiel. Konnte mir keinen besseren Namen einfallen lassen, aber ja ich benutze immer einzelne Operationen pro Methode. –

Verwandte Themen