LINQ将列表分组并返回具有嵌入字典的自定义对象的列表

时间:2016-07-25 18:27:46

标签: c# linq

我有一个大型数据集,我正在尝试按一组字段对此数据集进行分组。在这个数据集中,我有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)
    },
    .
    .
    .
}

此代码导致重复键错误。我通过将字典转换为元组列表来实现这一点,但这不是理想的最终结果。任何人都有关于如何做到这一点的建议。

由于

1 个答案:

答案 0 :(得分:1)

在您过滤掉BusDate以外的任何内容后,您需要在DT上执行内部小组,然后您需要聚合Balance。您可以像我这里使用SumFirst().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