2014-01-30 31 views
0

我有幾個函數需要在對象列表中創建一個圖表系列。它看起來是重複的,我覺得我可以用Lambda表達式或模板來替換這些類似的功能,但一直未能弄清楚如何處理每個對象上的不同屬性名稱。有人可以幫忙嗎?我可以使用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; 
} 

我想它可能看起來像:

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對象,所以我只是改變了模板簽名。私人系列GetSeries (List list,Func selector1,Func selector2) – FistOfFury

相關問題