LINQ对列表进行分组,并返回具有嵌入Dictionary的自定义对象的列表
本文关键字:列表 Dictionary 自定义 对象 LINQ 返回 | 更新日期: 2023-09-27 17:58:36
我有一个很大的数据集,我正试图用一组字段对这个数据集进行分组。在这个数据集中,我有5个连续日期的行(余额)。我的目标是返回一个自定义对象列表,其中有一个IDictionary字段,Key作为日期,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)
},
.
.
.
}
此代码导致重复密钥错误。我通过将字典转换为元组列表来实现这一点,但这不是预期的最终结果。请任何人对如何完成这项工作提出建议。
感谢
在过滤掉任何不在DT
中的内容后,似乎需要在BusDate
上进行内部分组,然后需要聚合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
。