2016-07-25 43 views
0

我有一個大的數據集,我試圖按照一組字段對這個數據集進行分組。在這個數據集中,我有5個連續日期的行(餘額)。我的目標是返回一個自定義對象列表,其中包含一個帶有Key的IDictionary字段作爲日期和平衡值。我試過類似的東西:LINQ將一個列表分組並返回一個具有嵌入字典的自定義對象的列表

int[] DT = new int[] {20160725,20160726,20160727,20160728,20160729}; 
var tranformedData = 
posData 
.GroupBy(p => new {p.Symbol, p.Account}) 
.Select(gp => new TPosModel { 
    Symbol = gp.Key.Symbol, 
    Account = gp.Key.Account, 
    Balances = new Dictionary<int, decimal>{ 
    { 
     gp.Where(gpi => gpi.BusDate == DT[0]).Select(gpi => gpi.BusDate), 
     gp.Where(gpi => gpi.BusDate == DT[0]).Select(gpi => gpi.Balance) 
    }, 
    { 
     gp.Where(gpi => gpi.BusDate == DT[1]).Select(gpi => gpi.BusDate), 
     gp.Where(gpi => gpi.BusDate == DT[1]).Select(gpi => gpi.Balance) 
    }, 
    . 
    . 
    . 
} 

此代碼導致重複鍵錯誤。我通過將字典轉換爲元組列表來實現這一目標,但這不是最終的結果。任何人都有關於如何完成這個請求的建議。

感謝

+0

你可以顯示輸入類嗎?還有'TPosModel'類? –

+0

@YacoubMassad,輸入從平面文件讀取,格式爲: 'List({Symbol =「ABC.D」,Account =「1234-0C」,BusDate = 20160725,Balance = 123.45},{Symbol = 「ABC.D」,帳戶=「1234-0C」,BusDate = 20160726,餘額= 125.67},{Symbol =「BCD.E」,帳戶=「2345-0D」,BusDate = 20160725,餘額= -2300.5}, {Symbol =「BCD.E」,Account =「2345-0D」,BusDate = 20160726,Balance = -2350.5})' 此列表需要轉換爲: 'List({Symbol =「ABC.D」 ,帳戶=「1234-0C」,餘額= {[20160725,123.45],[20160726,125.67]}},{Symbol =「BCD.E」,帳戶=「2345-0D」,餘額= {[20160725, - 2300.5] [20160726,-2350.5]}})' – skoppisetti

回答

1

它看起來像你需要通過在BusDate做一個內部小組過濾掉任何後不在DT,然後你需要聚集Balance。您可以使用Sum,因爲我在這裏或其他類似First().Balance。這隻取決於你想如何處理同一天的多個餘額。

int[] DT = new int[] {20160725,20160726,20160727,20160728,20160729}; 
var tranformedData = 
posData 
.GroupBy(p => new {p.Symbol, p.Account}) 
.Select(gp => new TPosModel { 
    Symbol = gp.Key.Symbol, 
    Account = gp.Key.Account, 
    Balances = gp.Where(gpi => DT.Contians(gpi.BusDate)) 
       .GroupBy(gpi => gpi.BusDate) 
       .ToDictionary(g => g.Key, g => g.Sum(x => x.Balance) 
    }); 

作爲一個側面說明,你可能會想你日期存儲爲DateTime,而不是int

+0

感謝,似乎工作。這是我做過什麼: '... 餘額= gp.Where(GPI => DT.Contains(gpi.BusDate)) .GroupBy(GPI => gpi.BusDate) .ToDictionary(G =「G .Key,g => g.FirstOrDefault()。Balance)' 我在'g.FirstOrDefault()'得到了一個可能的空引用的警告。我會再測試一下並標記爲已解決。 – skoppisetti

+1

@skoppisetti Acutally你可以使用'First',因爲這些分組至少有一個項目'g => g.First()。Balance'。 – juharr

相關問題