2011-10-07 71 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){...}