C# 将lambda作为参数传递

C# 将lambda作为参数传递,c#,C#,我有两种方法,其中唯一的区别是一个lambda谓词: public static double LowerQuartile(this IOrderedEnumerable<double> list) { var median = list.Median(); var elements = list.Where(x => x < median).ToList(); if (!list.Contains(median)) element

我有两种方法,其中唯一的区别是一个lambda谓词:

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

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

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

    return elements.OrderBy(x => x).Median();
}
public静态双低四分位(此IOrderedEnumerable列表)
{
var median=list.median();
var elements=list.Where(x=>xx).Median();
}
公共静态双上四分位(此IOrderedEnumerable列表)
{
var median=list.median();
var elements=list.Where(x=>x>median.ToList();
如果(!list.Contains(中位数))
元素。添加(中位数);
返回元素.OrderBy(x=>x).Median();
}
所以我想加入它们并传递一个lambda作为参数。我试过这样的方法:

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();
}
publicstaticdouble-CalculateQuartile(IOrderedEnumerable列表,表达式谓词)
{
var median=list.median();
var elements=list.Where(谓词).ToList();
如果(!list.Contains(中位数))
元素。添加(中位数);
返回元素.OrderBy(x=>x).Median();
}

但它不起作用。我该怎么做呢?

lambdas
x=>x
x=>median
都是
Func
类型。由于您确实将
中值作为另一个变量,因此您也必须将其作为一个参数接受,因此最终将使用
Func


为了让用户更容易使用,我仍然提供了
CalculateUpperQuartile
CalculateLowerQuartile
函数,但当然,您可以在内部使用单个实现来处理这两个函数。

它可以是这样的

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();
}

老实说,我将加入您和L.B.的答案,我将保留两种方法CalculateUpperQuartile和CalculateLowerQuartile,但它们将使用第三种方法并传递谓词,这样最终用户仍然可以选择。
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();
}
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);