[.NET]LINQ的Sum和我想得不一樣...

  • 6582
  • 0

摘要:[.NET]LINQ的Sum和我想得不一樣...

今天實作LINQ時想針對SUM語法做了一些變化~

但執行結果卻不如預想的那樣,先紀錄下來問題再來找找是否有無解法

 

實作內容是這樣的

有兩個資料源

一個是委託的資料

委託資料
時間 單號 委託單價 委託單量
10:28:54:08 T0144 87 100
10:28:54:08 I0147 86 100
10:28:54:08 M0147 85 100
10:33:44:02 T0144 87 -100
10:33:45:04 T0332 84 100
10:48:02:05 I0147 86 -90

一個是成交的資料

成交資料
時間 單號 成交單價 成交價
10:38:13:41 I0147 86 -10

單量會是負的有兩種情況:

1、原本的委託單要刪除

2、成交後也算負的(因為之後要累計剩餘的單量)

 

單號是用來對應委託及成交的資料

需求是要求每個時間裡,市場上還有單量的最高價位是多少

說明:

10:28:54:08 市場上有 87、86、85三個價位,所以最高價為87

而到了10:33:44:02 看到將在87價位的單子抽掉(單量是負的),對應到原本的T0144單,所以最高的價位改為86

10:33:45:04時,掛了100張84價位的單子,此時最高價位依然是86

10:38:13:41時,成交86價位單有10張

10:48:02:05時,抽掉86價位單90(原本市場上100張的單子已被38分時成交了10張),故此時價位應為85

 

以下為目前做法


        /// 
        /// 依委託的時間,取得目前市場上委託金額最高
        /// 
        /// 

成交回報資料
        /// 

委託回報資料
        /// 

委託時間
        /// 目前市場上委託金額最高價格
        public double GetOrderPriceByTime(Dictionary MatchData, Dictionary OrderData, DateTime dt)
        {
            double result = 0;

            var data = from k in OrderData
                       where k.Value.TrxDateTime <= dt
                       group k by new { k.Value.Price } into g
                       where g.Sum(k => (k.Value.Qty + GetMatchQtyByTime(MatchData, dt, k.Value.OrderSEQNO))) != 0
                       orderby g.Key.Price descending
                       select new { Price = g.Key.Price };

            if (data.Count() > 0)
            {
                result = data.First().Price;
            }

            return result;
        }

 


        /// 
        /// 依時間取得成交回報的單量
        /// 
        /// 

成交資料來源
        /// 

成交時間
        /// 

成交價
        /// 單量
        public double GetMatchQtyByTime(Dictionary MatchData, DateTime dt, string OrderSEQNO)
        {
            double result = 0;

            var data = from k in MatchData
                       where k.Value.TrxDateTime <= dt && k.Value.OrderSEQNO == OrderSEQNO
                       group k by k.Value.Price into g
                       where g.Sum(k => k.Value.Qty) < 0
                       select new { Qty = g.Sum(k => k.Value.Qty) };

            if (data.Count() > 0)
            {
                result = data.First().Qty;
            }

            return result;
        }

但用上述方法卻發生一個問題,在算48分的價位時,卻還是算出86的價位,而不是85...

不知是否在以下Sum的使用方式是不是有誤?目前則正在找尋解答中...

g.Sum(k => (k.Value.Qty + GetMatchQtyByTime(MatchData, dt, k.Value.OrderSEQNO)))