Gestion des valeurs uniques et multiples dans les méthodes C # efficacement

voix
2

J'ai une méthode comme:

AverageAndDoSomeMath (Point2)

et je me demande comment gérer:

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

en utilisant une seule mise en oeuvre de préférence.

Pour la collecte, je prévois d'utiliser le type IEnumerable pour que je puisse passer tout type de collection, mais pour une seule valeur, je ne veux pas envelopper et de le transmettre comme une collection, parce que la collection elle-même ne sert à rien, autre que de satisfaire le type.

Comment gérer le mieux dans la plus claire, moyen le plus rapide, le plus efficace?

EDIT: Peut-être que je devrais choisir un meilleur nom de la méthode, mais la méthode calcule la moyenne de tous les points, pour 1 valeur, il n'a pas de sens, mais penser comme que la valeur sera utilisée pour dire calculer une autre valeur, mais ce qui est important est de trouver la moyenne, je ne peux pas appeler la 1ère méthode.

Créé 02/03/2009 à 19:03
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
9

Écrire deux méthodes

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

et de faire la 1ère appel le 2ème en l'enveloppant dans une collection.

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

Je devine que c'est ce que vous aviez déjà à l'esprit, mais pensait que cela ne la bonne solution, non?

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

Créé 02/03/2009 à 19:06
source utilisateur

voix
9

Je sais que vous avez dit que vous ne vouliez pas envelopper et de le transmettre comme une collection, mais il y a deux façons dont vous pouvez le faire avec un minimum de tracas, donc je les posterai au cas où vous n'êtes pas au courant d'un.

Vous pouvez utiliser params sur votre méthode:

public void Average(params Point2[] points)

après quoi vous pouvez l'appeler avec un certain nombre 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 alternativement, vous pouvez utiliser courte syntaxe de tableau pour envelopper votre objet:

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

EDIT: Après avoir lu votre note, je suggère qu'un tableau de params est la façon la plus claire de faire ce que vous voulez. Le seul véritable inconvénient est que vous ne pouvez pas passer dans un IEnumerable<Point2>(ou d' autres collections comme un List<Point2>) sans appel ToArray(), car il ne prend que des tableaux réels.

Créé 02/03/2009 à 19:10
source utilisateur

voix
1

une responsabilité unique par méthode serait dire que votre méthode ne doit faire une chose - calculer la moyenne arithmétique - et c'est tout. Non "AndDoSomeOtherMath".

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

Pour votre information, vous pouvez calculer une moyenne et l' écart - type à la volée sans avoir à stocker toutes les valeurs. Il est beaucoup plus facile sur la mémoire. John D. Cook a un grand article de blog sur la façon de le faire pour l' écart - type.

Créé 02/03/2009 à 20:01
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more