Domanda

Ho un metodo come:

AverageAndDoSomeMath (Point2)

e mi chiedo come gestire:

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

usando preferibilmente un'unica implementazione.

Per la raccolta, ho intenzione di utilizzare il tipo IEnumerable in modo da poter passare qualsiasi tipo di raccolta, ma per un singolo valore, non voglio racchiuderlo e passarlo come raccolta, poiché la raccolta stessa non serve a nulla, diverso da soddisfare il tipo.

Come gestirlo al meglio nel modo più chiaro, veloce ed efficiente?

MODIFICA: Forse avrei dovuto scegliere un nome di metodo migliore, ma il metodo calcola la media di tutti i punti, per 1 valore non ha senso, ma pensalo come il valore verrà usato per dire calcola un altro valore, ma l'importante è trovare la media, quindi non posso chiamare il primo metodo.

È stato utile?

Soluzione

So che hai detto che non volevi avvolgerlo e passarlo come una raccolta, ma ci sono due modi in cui puoi farlo con il minimo fastidio, quindi li posterò nel caso in cui non ne fossi a conoscenza .

Puoi usare i parametri sul tuo metodo:

public void Average(params Point2[] points)

dopo di che puoi chiamarlo con qualsiasi numero di argomenti o con un 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);

O in alternativa, puoi usare una sintassi di array breve per concludere il tuo oggetto:

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

MODIFICA: Dopo aver letto la tua nota, suggerirei che un array di parametri è il modo più chiaro per fare ciò che vuoi. L'unico aspetto negativo è che non è possibile passare un IEnumerable<Point2> (o altre raccolte come un List<Point2>) senza prima chiamare ToArray(), perché richiede solo array effettivi.

Altri suggerimenti

Scrivi due metodi

  • AverageAndDoSomeMath (punto Point2)
  • AverageAndDoSomeMath (IEnumerable < Point2 > points)

e fai in modo che il primo chiami il secondo avvolgendolo in una raccolta.

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

Immagino sia quello che avevi già in mente, ma hai pensato che non fosse la soluzione corretta, giusto?

Modifica: il metodo è stato semplificato (grazie a Freddy Rios)

una singola responsabilità per metodo direbbe che il tuo metodo dovrebbe fare solo una cosa - calcolare la media aritmetica - e basta. No & Quot; AndDoSomeOtherMath & Quot ;.

E se guardi la formula per la media, puoi certamente calcolare qualcosa di significativo con un solo punto. È una deviazione standard che richiede due o più.

Cordiali saluti, è possibile calcolare una deviazione media e standard al volo senza dover memorizzare tutti i valori. È molto più facile in memoria. John D. Cook ha un ottimo articolo di blog su come farlo per deviazione standard.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top