摘要:[.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;
}
但用上述方法卻發生一個問題,在算48分的價位時,卻還是算出86的價位,而不是85...
不知是否在以下Sum的使用方式是不是有誤?目前則正在找尋解答中...
g.Sum(k => (k.Value.Qty + GetMatchQtyByTime(MatchData, dt, k.Value.OrderSEQNO)))
///
成交資料來源
///
成交時間
///
成交價
///