0

我有一组基本上具有这种结构的实体。

{Stats Name="<Product name> (en)" TotalResources="10" ..}
    {DayStats Date="2009-12-10" TotalResources="5"}
    {DayStats Date="2009-12-11" TotalResources="5"}
{Stats}
{Stats Name="<Product name> (us)" TotalResources="10" ..}
    {DayStats Date="2009-12-10" TotalResources="5"}
    {DayStats Date="2009-12-11" TotalResources="5"}
{Stats}
...

我不想从这个集合中提取的是一个新集合实体(或上面示例中的实体),其中第一级已按(忽略国家标签)分组,其中所有/部分属性已汇总在一起,包括每天的 {DayStas} 的子列表。因此,示例的结果集如下所示:

{Stats Name="<Product name>" TotalResources="20" ..}
    {DayStats Date="2009-12-10" TotalResources="10"}
    {DayStats Date="2009-12-11" TotalResources="10"}
{Stats}
...

所以我的问题是:是否有可能在 LINQ 中以更优雅的方式而不是普通的“loop-trhough-each-entity-and-compare”方式来做到这一点?

而且我不希望该集合包含与原始集合相同类型的实体({Stats},{DayStats}),您的答案不需要包含代码,我可能可以自己解决。只是让您知道,以防您需要考虑到这一点。

(很抱歉,如果之前已经讨论过这个问题,我尝试搜索无济于事。我想我的搜索技巧是 fuubar ;))

圣诞快乐 =)

4

2 回答 2

0

有点晚了,但也许仍然有用。RemoveCountry 应该是一个扩展方法,它返回不带国家后缀的 Stats 名称。

IEnumerable<Stats> aggregated =
    from stat in stats
    group stat by stat.Name.RemoveCountry() into grp
    select new Stats
    {
        Name = grp.Key,
        TotalResources = (from stat in grp select stat.TotalResources).Sum(),
        DayStats = (from stat in grp
                    from dayStat in stat
                    group dayStat by dayStat.Date into dgrp
                    select new DayStats
                    {
                        Date = dgrp.Key,
                        TotalResources = (from dayStat in dgrp select dayStat.TotalResources).Sum()
                    }).ToList()
    };
于 2010-04-28T03:36:04.730 回答
0

尝试:

 dataset.SelectMany(p => new {stat=p, daystats=p.DayStats)
        .GroupBy(c => c.stat.Name.SubString(0, c.stat.Name.Length - 5))
于 2009-12-23T10:25:07.263 回答