我有一个大型数据集,我正在尝试按一组字段对此数据集进行分组。在这个数据集中,我有5个连续日期的行(余额)。我的目标是返回一个自定义对象列表,该列表包含一个IDictionary字段,其中Key为Date,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 = 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 :(得分: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
。