Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以用lambda表达式替换多个类似的方法吗?_C#_Templates - Fatal编程技术网

C# 我可以用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.

我有几个函数可以接收对象列表,并用它们创建一个图表系列。它看起来是重复的,我觉得我可以用Lambda表达式或模板替换这些类似的函数,但我还没弄清楚如何处理每个对象上不同的属性名。有人能帮忙吗

以下是我所拥有的:

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[])签名