2012-03-28 116 views
2

我有下面的數據表:如何通過一組來計算重量平均價格?

 
qty  price  date 
5   2  1/25 
6   1  1/25 
8   3  4/25 
1   2  4/25 

,我想:

 
qty  price date 
11  1.45  1/25 
9  2.88  4/25 

我已經組數據表按日期

 
var groups = ToCalc.AsEnumerable().GroupBy(r => r.Field("trade_date")); 

和數量總和是這樣的:

 
      foreach (var group in groups) 
      { 
       qty = Convert.ToDouble(group.Sum(r => r.Field("EXEC_QTY"))); 
      } 

但我不知道如何計算加權平均價格。 有什麼想法?

+0

可能重複(HTTP:/ /stackoverflow.com/questions/2714639/weightedoverave-with-linq) – 2014-03-12 11:30:15

回答

3
weightedAverage = group.Sum(r => r.Field("EXEC_QTY") * r.Field("price")) 
    /group.Sum(r => r.Field("EXEC_QTY")); 

如果您確實需要,請添加Convert.ToDouble。

既然你評論說,數量是一張雙人牀和價格是一個小數:

weightedAverage = group.Sum(r => (decimal)r.Field("EXEC_QTY") * r.Field("price")) 
    /group.Sum(r => (decimal)r.Field("EXEC_QTY")); 

(那豈不是更有意義的價格是小數和數量是一個雙,或兩者兼有是?十進制)

+0

謝謝,我試過了:price = Convert.ToDouble(group.Sum(r => r.Field (「EXEC_QTY」)* r.Field (「EXEC_PRICE」)) /group.Sum(r => r.Field (「EXEC_QTY」)));但是EXEC_QTY是一個小數,EXEC_Price是一個double,如何處理? – 2012-03-28 15:54:45

+0

@francopshenri我編輯了答案 – phoog 2012-03-28 15:59:16

+0

我知道這確實有意義...... – 2012-03-29 05:11:00

0
class Data 
    { 
     public int Qty { get; set; } 
     public double Price { get; set; } 
     public string Date { get; set; } 
    } 
    static void Main(string[] args) 
    { 
     var data = new Data[] { 
      new Data { Qty = 5, Price = 2, Date = "1/25" }, 
      new Data { Qty = 6, Price = 1, Date = "1/25" }, 
      new Data { Qty = 8, Price = 3, Date = "4/25" }, 
      new Data { Qty = 1, Price = 2, Date = "4/25" }, 
     }; 

     var weighted = data.GroupBy(x => x.Date) 
          .Select(group => new Data { 
           Date = group.Key, 
           Qty = group.Sum(i => i.Qty), 
           Price = group.Sum(i => i.Price * i.Qty)/group.Sum(i => i.Qty) 
         });    
    } 
0

我會做這樣的事情:

var results = ToCalc.AsEnumerable() 
    .GroupBy(r => r.Field("trade_date")) 
    .Select(grp => 
      { 
       var quantity = grp.Sum(r => r.Field("EXEC_QTY")); 
       var avg = grp.Sum(r => r.Field("EXEC_QTY") * r.Field("price"))/quantity; 
       return new { 
           TradeDate = grp.Key, 
           Quantity = quantity, 
           WeightedAverage = avg 
          }; 
      }); 

然後10將是一個包含你想要的信息的匿名對象的枚舉,它更容易訪問的結構。

0

你可以執行一個方法中的所有分組使用this Enumerable.GroupBy過載:

var groups = ToCalc.AsEnumerable() 
    .GroupBy(r => r.date, (k, g) => new 
    { 
     date = k, 
     qty = g.Sum(i => i.qty), 
     price = g.Sum(i => i.qty * i.price)/g.Sum(i => i.qty) 
    }); 

這會給你這樣的:

{ date = "1/25", qty = 11, price = 1.4545454545454546 } 
{ date = "4/25", qty = 9, price = 2.8888888888888888 } 
[LINQ的加權平均]的