C# 将lambda作为参数传递
我有两种方法,其中唯一的区别是一个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
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);