2009-12-23 7 views
0

J'ai un ensemble d'entités qui a essentiellement cette structure.Regroupement d'une liste d'entités ayant une sous-liste dans C#

{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} 
... 

Ce que je wan't pour extraire de cet ensemble est une nouvelle entités ensemble (ou une entité dans l'exemple ci-dessus) où le premier niveau a été regroupé par le (en ignorant l'étiquette du pays) où tous/certains des les propriétés ont été résumées ensemble, y compris la sous-liste de {DayStas} sur une base par jour. Ainsi, le jeu de résultats de l'exemple ressemblerait à quelque chose comme ceci:

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

Donc, ma question est: Est-il possible de le faire d'une manière plus élégante LINQ plutôt que la vanille « boucle-trhough-chaque entité -et-compare "-way?

Et je ne voudrais pas que l'ensemble contienne le même type d'entités que l'ensemble original ({Stats}, {DayStats}), votre réponse n'a pas besoin d'inclure de code pour cela, je peux probablement le faire par moi-même. Juste pour vous faire savoir que vous devez en tenir compte.

(Je suis désolé si cette question a été discutée avant, j'ai essayé de chercher en vain Je suppose que mes compétences de recherche sont fuubar;.))

Joyeux Noël =)

Répondre

0

Essayez:

dataset.SelectMany(p => new {stat=p, daystats=p.DayStats) 
     .GroupBy(c => c.stat.Name.SubString(0, c.stat.Name.Length - 5)) 
+0

Je pense que vous avez manqué l'essence de la question. La partie gênante est la somme des propriétés de l'entité et de la sous-liste. Mais merci quand même! –

+0

J'ai réalisé, j'espère que cela aidera plus :) – Wouter

+0

Un peu, mais pas tout le chemin, au moins à ma compréhension. Je n'arrive pas à voir comment cela résume les propriétés de l'entité à la fois au premier niveau et au deuxième niveau? –

0

Un peu en retard, mais peut-être encore utile. RemoveCountry doit être une méthode d'extension qui renvoie le nom des statistiques sans le suffixe country.

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() 
    };