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)
    },
    .
    .
    .
}

此代码导致重复密钥错误。我通过将字典转换为元组列表来实现这一点,但这不是预期的最终结果。请任何人对如何完成这项工作提出建议。

感谢

LINQ对列表进行分组,并返回具有嵌入Dictionary的自定义对象的列表

在过滤掉任何不在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