2016-07-25 67 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

相关问题