C# 我可以用lambda表达式替换多个类似的方法吗?
我有几个函数可以接收对象列表,并用它们创建一个图表系列。它看起来是重复的,我觉得我可以用Lambda表达式或模板替换这些类似的函数,但我还没弄清楚如何处理每个对象上不同的属性名。有人能帮忙吗 以下是我所拥有的:C# 我可以用lambda表达式替换多个类似的方法吗?,c#,templates,C#,Templates,我有几个函数可以接收对象列表,并用它们创建一个图表系列。它看起来是重复的,我觉得我可以用Lambda表达式或模板替换这些类似的函数,但我还没弄清楚如何处理每个对象上不同的属性名。有人能帮忙吗 以下是我所拥有的: private static Series getBuysSeries(List<Order> buys) { var series = new Series(); foreach (var buy in buys) { series.
private static Series getBuysSeries(List<Order> buys)
{
var series = new Series();
foreach (var buy in buys)
{
series.Points.AddXY(buy.Price, buy.Quantity);
}
return series;
}
private Series getPriceSeries(List<Trade> trades)
{
var series = new Series();
foreach (var trade in trades)
{
series.Points.AddXY(trade.DateTimeUTC, trade.UnitPrice);
}
return series;
}
私有静态系列getBuysSeries(列表购买)
{
var系列=新系列();
foreach(var买入)
{
系列.Points.AddXY(购买.价格,购买.数量);
}
返回序列;
}
私人系列getPriceSeries(列出交易)
{
var系列=新系列();
foreach(var交易中的交易)
{
series.Points.AddXY(trade.DateTimeUTC,trade.UnitPrice);
}
返回序列;
}
我认为它可能看起来像:
private static Series getBuysSeries(List<Order> buys)
{
return getSeries<Order>(buys);
}
private Series getPriceSeries(List<Trade> trades)
{
return getSeries<Trade>(trades);
}
private Series getSeries<T>(List<T> list)
{
...do the loop but account for property names...
}
私有静态系列getBuysSeries(列表购买)
{
退货系列(购买);
}
私人系列getPriceSeries(列出交易)
{
退货系列(交易);
}
私人系列getSeries(列表)
{
…执行循环,但要考虑属性名称。。。
}
是的,你可以。至少,你可以这样做。例如,将方法名称更改为更常规的名称,并对方法调用使用泛型类型推断:
private static Series GetBuysSeries(List<Order> buys)
{
return GetSeries(buys, buy => buy.Price, buy => buy.Quantity);
}
private Series GetPriceSeries(List<Trade> trades)
{
return getSeries<Trade>(trades,
trade => trade.DateTimeUtc,
trade => trade.UnitPrice);
}
private Series GetSeries<T>(List<T> list,
Func<T, double> selector1,
Func<T, double> selector2)
{
var series = new Series();
foreach (var item in list)
{
series.Points.AddXY(selector1(item), selector2(item));
}
return series;
}
是的,你可以。至少,你可以这样做。例如,将方法名称更改为更常规的名称,并对方法调用使用泛型类型推断:
private static Series GetBuysSeries(List<Order> buys)
{
return GetSeries(buys, buy => buy.Price, buy => buy.Quantity);
}
private Series GetPriceSeries(List<Trade> trades)
{
return getSeries<Trade>(trades,
trade => trade.DateTimeUtc,
trade => trade.UnitPrice);
}
private Series GetSeries<T>(List<T> list,
Func<T, double> selector1,
Func<T, double> selector2)
{
var series = new Series();
foreach (var item in list)
{
series.Points.AddXY(selector1(item), selector2(item));
}
return series;
}
这真是一个深思熟虑的回答。我会看一下,然后再给你回复。这个答案的动态输入部分+1。不知道这是可能的:-)哥们,那太棒了。正是我要找的!事实证明DateTimeUTC是一个DateTime对象,所以我只是更改了模板签名。private Series GetSeries(List List,Func selector1,Func selector2)@fistofury:那么
AddXY
也是通用的吗?或者它需要object
parameters吗?@JonSkeet AddXY有一个(双重,双重)签名和一个(object,params object[])签名,这是一个非常深思熟虑的答案。我会看一下,然后再给你回复。这个答案的动态输入部分+1。不知道这是可能的:-)哥们,那太棒了。正是我要找的!事实证明DateTimeUTC是一个DateTime对象,所以我只是更改了模板签名。private Series GetSeries(List List,Func selector1,Func selector2)@fistofury:那么AddXY
也是通用的吗?或者它需要object
parameters吗?@JonSkeet AddXY有一个(double,double)签名和一个(object,params object[])签名