2014-01-25 3 views
3

나는 두 가지 방법이있다. 나는 이런 식으로 시도했다 :패스 람다 인수

public static double CalculateQuartile(IOrderedEnumerable<double> list, Expression<Func<IOrderedEnumerable<double>,bool>> predicate) 
{ 
    var median = list.Median(); 
    var elements = list.Where(predicate).ToList(); 
    if (!list.Contains(median)) 
     elements.Add(median); 

    return elements.OrderBy(x => x).Median(); 
} 

그러나 작동하지 않는다. 내가 어떻게 할 수 있니?

답변

3

그것은이

public static double Quartile(this IOrderedEnumerable<double> list, 
           Func<double,double,bool> predicate) 
{ 
    var median = list.Median(); 
    var elements = list.Where(x=>predicate(x,median)).ToList(); 
    if (!list.Contains(median)) 
     elements.Add(median); 

    return elements.OrderBy(x => x).Median(); 
} 

같은 것을 할 수 있고

var val = list.Quartile((x, y) => x > y); 
2

람다 x => x < medianx => x > median은 모두 Func<double, bool>입니다. 당신이 내부에 또 다른 변수로 median을해야합니까, 당신은 너무 매개 변수로 받아 들일해야합니다, 그래서 당신은 Func<double, double, bool>로 끝날 것 :

public static double CalculateQuartile(this IOrderedEnumerable<double> list, 
     Func<double, double, bool> predicate) 
{ … } 

당신은 표현으로 그것을 할 수 및 붙여 넣기 런타임에 median을 참조하십시오.하지만 반대 의견을 제시합니다.

대신이 함수를 사용하는 사용자가 올바르게 작동하도록 올바른 람다를 지정하지 않아도되는 방식으로이 문제를 해결할 것을 권장합니다. 결국, 당신은 단지 두 가지 경우가 있습니다 : 상위 사 분위수와 하위 사 분위수. 그래서 당신은 단순히 당신이 낮은 사이에 상위 분위수를 선택할 수 있습니다 대신 매개 변수로 부울 플래그가 할 수 있습니다 : 난 아직도 제공하는 것이,

public static double CalculateQuartile(this IOrderedEnumerable<double> list, 
     bool calculateUpperQuartile = false) 
{ 
    var median = list.Median(); 
    var predicate = calculateUpperQuartile ? (x => x > median) : (x => x < median); 
    var elements = list.Where(predicate).ToList(); 
    if (!list.Contains(median)) 
     elements.Add(median); 

    return elements.OrderBy(x => x).Median(); 
} 

는 사용자가 더 사용할 수 있도록하려면를 모두 CalculateUpperQuartileCalculateLowerQuartile 물론 내부적으로 단일 구현을 사용하여 두 가지 모두를 처리 할 수 ​​있습니다.

+0

솔직히 나는 당신과 L.B.에 가입 할대로 사용할 수 있습니다 대답과 나는 CalculateUpperQuartile과 CalculateLowerQuartile 두 가지 방법을 모두 유지할 것이지만 세 번째 방법을 사용하고 술어를 전달하므로 최종 사용자는 여전히이 방법을 선택할 수 있습니다. – kosnkov