2011-10-07 5 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>, ...) 비정상적인 IEnumerable 인수로 인한 오버 헤드를 방지합니다. C#에는 where T : numconstraint이 없기 때문에 지원하려는 모든 기본 유형에 오버로드를 제공해야합니다 (Int32, Int64, Single, Double, Decimal, ...).

+0

아니면 더 나은 ... – Charlie

+1

방금 ​​예를 들어 평균을 사용했다고 언급 했어야합니다. 데이터 컬렉션에 작용해야하는 몇 가지 숫자 알고리즘이 있습니다. – john

1

인터페이스를 통해 배열이나 다른 컬렉션을 제공 할 수 있습니다. 하지만 IEnumerable<int>과 같이 강력한 형식의 인터페이스를 사용할 수도 있습니다.

+0

"IEnumerable 같은 강력하게 형식화 된 인터페이스"는 "IEnumerable 과 같이 강력하게 형식화 된 인터페이스"를 의미한다고 생각하십니까? –

+0

방금 ​​내 대답을 편집했고, 코드 블록에 넣지 않았으므로 꺾쇠 괄호가 표시되지 않았습니다. – Charlie

0

과 같이, 당신은 IEnumerable을 사용해야 만 예를 Average입니다 가정하지만 데이터 형식으로 funciton 과부하 : 예를 들어 IEnumerable<DataType>

:

double Average(IEnumerable<Int32> array){...} 
double Average(IEnumerable<Double> array){...} 
관련 문제