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 でよりエレガントな方法でこれを行うことは可能ですか?

また、セットに元のセット ({Stats}、{DayStats}) と同じ種類のエンティティを含めたくありません。回答にそのためのコードを含める必要はありません。おそらく自分で解決できます。それを考慮する必要がある場合に備えてお知らせします。

(この質問が以前に議論されていた場合は申し訳ありませんが、無駄に検索しようとしました。私の検索スキルは fuubar だと思います ;))

メリークリスマス =)

4

2 に答える 2

0

少し遅れますが、それでも役立つかもしれません。RemoveCountryは、国のサフィックスなしで統計の名前を返す拡張メソッドである必要があります。

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 に答える