2011-10-07 72 views
1

我只是好奇,以下示例被认为是“最佳实践”:我有一个数值数组或数字列表,并希望将其提供给函数以返回平均值。C#方法过载与接口参数

是更好地重载方法为每个个案:

double Average(int[] intArray){...} 
double Average(uint[] uintArray){...} 
double Average(double[] doubleArray){...} 
... 
double Average(List<int> intList){...} 
... 

或者,是它更好地使用某种类型的接口:

double Average(IEnumerable arrayOrList) 
{ 
    // Branching logic for array or list. 
} 

谢谢!

EDIT

Average被用作一个例子。我有几种数字算法需要能够在各种数字数据上运行。

+0

这看起来像一个总理候选人延期方法。 –

回答

3

看看在Enumerable.Average Extension Method的指导各种重载:

public static double Average(this IEnumerable<int> source) 

在这种风格的方法适用于实现任何集合类型IEnumerable<T>T[]List<T>HashSet<T>ReadOnlyCollection<T>,...)并避免由非通用的参数引起的开销。由于C#没有where T : numconstraint,因此您需要为您希望支持的所有基元类型(Int32Int64,Single,Double,Decimal,...)提供过载。

+0

或甚至更好这... – Charlie

+1

我应该提到,我只是用平均值作为例子。我有几个数字算法需要对数据集进行操作。 – john

1

一个接口将允许您提供一个数组或任何其他集合。虽然你可能想使用强类型的接口,如IEnumerable<int>

+0

我假设通过“像IEnumerable这样的强类型接口”,你的意思是“像IEnumerable ”这样的强类型接口? –

+0

我刚刚编辑了我的答案,没有把它放在代码块中,所以尖括号没有显示 – Charlie

0

假设Average只是一个例子,你应该使用IEnumerable的,但你的数据类型重载功能可按,像这样:IEnumerable<DataType>

例如:

double Average(IEnumerable<Int32> array){...} 
double Average(IEnumerable<Double> array){...}