Question

J'ai une méthode comme celle-ci:

AverageAndDoSomeMath (Point2)

et je me demande comment gérer:

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

en utilisant une seule implémentation de préférence.

Pour la collecte, je prévois d'utiliser le type IEnumerable afin de pouvoir transmettre n'importe quel type de collection, mais pour une valeur unique, je ne souhaite pas l'envelopper et le transmettre en tant que collection, car la collection elle-même ne sert à rien. autre que pour satisfaire le type.

Comment le gérer de la manière la plus claire, la plus rapide et la plus efficace?

EDIT: J'aurais peut-être dû choisir un meilleur nom de méthode, mais la méthode calcule la moyenne de tous les points. Pour 1 valeur, cela n'a pas de sens, mais imaginez que la valeur sera utilisée pour calculer une autre valeur, mais ce qui est important, c'est de trouver la moyenne, je ne peux donc pas appeler la 1re méthode.

Était-ce utile?

La solution

Je sais que vous avez dit que vous ne vouliez pas l'envelopper et le transmettre en tant que collection, mais il y a deux façons de le faire avec un minimum de tracas, donc je les posterai au cas où vous ne le sauriez pas. .

Vous pouvez utiliser les paramètres de votre méthode:

public void Average(params Point2[] points)

après quoi vous pouvez l'appeler avec un nombre quelconque d'arguments, ou avec un tableau:

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

Ou bien, vous pouvez utiliser une syntaxe de tableau courte pour envelopper votre objet:

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

MODIFIER: Après avoir lu votre note, je dirais qu'un tableau params est le moyen le plus clair de faire ce que vous voulez. Le seul inconvénient, c’est que vous ne pouvez pas transmettre un IEnumerable<Point2> (ou d’autres collections comme un List<Point2>) sans appeler au préalable ToArray(), car il ne prend que les tableaux réels.

Autres conseils

Écrivez deux méthodes

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

et faites en sorte que le premier appelle le deuxième en l’enveloppant dans une collection.

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

Je suppose que c'est ce que vous aviez déjà en tête, mais vous avez pensé que ce n'était pas la bonne solution, n'est-ce pas?

Modifier: Simplifiez la méthode (grâce à Freddy Rios)

une seule responsabilité par méthode voudrait dire que votre méthode ne devrait faire qu’une chose - calculer la moyenne arithmétique - et le tour est joué. Non & Quot; AndDoSomeOtherMath & Quot;.

Et si vous regardez la formule pour la moyenne, vous pouvez certainement calculer quelque chose de significatif avec juste un point. C'est l'écart type qui en nécessite deux ou plus.

Pour votre information, vous pouvez calculer un écart moyen et un écart type à la volée sans avoir à stocker toutes les valeurs. C'est beaucoup plus facile sur la mémoire. John D. Cook a un excellent article de blog sur la marche à suivre pour obtenir un écart-type.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top