2014-01-30 3 views
0

У меня есть несколько функций, которые берут в списке объектов и создают из них ряд диаграмм. Это выглядит повторительно, и я чувствую, что могу заменить эти подобные функции функциями с помощью лямбда-выражений или шаблонов, но не смог выяснить, как обращаться с разными именами свойств на каждом объекте. Может кто-нибудь помочь?Могу ли я заменить несколько подобных методов на выражение лямбда?

Вот что у меня есть:

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

Я думаю, что это может выглядеть следующим образом:

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... 
} 

ответ

6

Да, вы можете. По крайней мере, вы можете это сделать. Например - изменив имена методов, чтобы быть более традиционными, и с помощью общего вывода типа для вызовов методы:

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

Теперь, это при условии, что AddXY принимает два double значения. Это кажется немного странным для trade.DateTimeUTC, но трудно дать более конкретный совет, не зная, как определяется Series.AddXY.

Если вы на самом деле хотите назвать перегрузку из AddXY в каждом случае, это будет немного сложнее. В этом случае вам может потребоваться динамическое типирование, например.

private Series GetSeries<T>(List<T> list, 
          Func<T, dynamic> selector1, 
          Func<T, dynamic> selector2) 
{ 
    var series = new Series(); 
    foreach (var item in list) 
    { 
     // Here the overload is determined at execution time... 
     series.Points.AddXY(selector1(item), selector2(item)); 
    } 
    return series; 
} 
+0

Это действительно продуманный ответ. Я посмотрю на это и вернусь к вам. – FistOfFury

+0

+1 для динамической типизирующей части этого ответа. Не знаю, что было возможно :-) – TGH

+0

чувак, это было потрясающе. Именно то, что я искал! Оказывается, DateTimeUTC является объектом DateTime, поэтому я просто изменил подпись шаблона. private Series GetSeries (Список list, Func selector1, Func selector2) – FistOfFury

Смежные вопросы