En passant un IEnumerable de Valeurs Numériques en tant que paramètre à la méthode

Je suis en train de jouer autour avec un programme très simple à prendre un tableau de doubles et de retour de l'écart-type. Cette partie a fonctionné, mais je voulais rendre le code plus réutilisable. Je voudrais faire en sorte que la méthode peut accepter un paramètre de n'importe quel type qui pourrait être considéré numérique et le retour de l'écart-type au lieu de coder en dur une double type (comme je l'ai d'abord fait dans ce programme). Comment fait-on à ce sujet et quel est le bon terme?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


    namespace ConsoleApplication5
    {
        class Program
        {
            static void Main(string[] args)
            {
                double[] avg = { 3.4, 55.6, 10.0, 4.5, 2, 2 };
                double x = avg.Average();
                //first round of testing
                Console.WriteLine("The average of the first array is below ");
                Console.WriteLine(x);
                Console.WriteLine("below should be the standard deviation!");
                Console.WriteLine(CalculateStandardDeviation(avg));
                Console.ReadLine();
                int[] intAvg = { 4, 3, 5, 6, 2 };
                double secondAvg = intAvg.Average();
                Console.WriteLine("The average of the second array is below ");
                Console.WriteLine(secondAvg);
                //this is where the error is happening
                //CalculateStandardDeviation(secondAvg);

            }
            //this is where I tried to make the query more reusable
            public static double CalculateStandardDeviation(IEnumerable<double> values)
            {

                double avg = values.Average();
                double sum = 0;
                foreach (double d in values)
                {
                    sum += Math.Pow((d - avg), 2);

                }

                return Math.Pow(sum / (values.Count() - 1),.5);

            }
        }
    }
Vous pouvez créer une méthode pour chaque type, on peut envisager une validité "d'entrée" et de laisser la surcharge de gérer tous les autres types de peut-être ensuite les jeter à double et d'appeler la version qui prend IEnumerable<double>. Vous pourriez être en mesure de le faire avec les génériques (voir ceci par exemple), mais il n'y a vraiment pas de bonne façon générique limiter aux seuls types numériques.
Vous n'avez pas ce genre de contrainte en C#, il n'y a pas de base Numeric type. C'est pourquoi, par exemple, Sum ou Average ont toutes ces surcharges...
Alors j'ai juste besoin de surcharger la méthode avec tous les possibles de types numériques que je veux inclure?
Ce serait une façon simple de gérer ça, oui. Cependant, ils peuvent tous partagent une même mise en œuvre. Vous n'avez pas à (et ne devrait pas) copier/coller et dupliquer le code dans chaque méthode.
Faites juste attention de la int surcharge version; vous ne voulez pas utiliser integer division/moyennes (par exemple, 5 / 2 = 2)

OriginalL'auteur wootscootinboogie | 2013-04-16