2016-10-03 3 views
1

Je travaille sur un projet où je dois pouvoir transformer une structure parent-enfant complexe en son équivalent parent-enfant, ceci est nécessaire car l'interrogation et la création de rapports sur les données doivent être possible à partir du parent ou de l'enfant pov. Cela peut ne pas faire beaucoup de sens, mais voici une version simplifiée avec des données de l'échantillon:Transformer une structure parent-enfant en parent enfant

Disons que j'ai ces données:

couleurs de base (rouge, bleu, vert) couleurs d'accent (rouge, jaune, bleu)

Et je veux le transformer en:

rouge (couleurs de base, les couleurs d'accent) bleu (couleurs de base, les couleurs d'accent) vert (couleurs de base) jaune (couleurs d'accent)

Il me semblait que Linq serait idéal pour cela, mais je ne peux pas le comprendre, je sais que je pourrais le faire à long terme, mais il semble juste maladroit.

Jusqu'à présent, j'ai cette classe de test pour travailler contre:

class UsageType 
{ 
    public string Usage { get; set; } 

    public List<Colour> Colours = new List<Colour>(); 
} 

class Colour 
{ 
    public string Name { get; set; } 
} 

public class TestClass 
{ 
    public TestClass() 
    { 
     var usageTypes = new List<UsageType>() 
      { 
       new UsageType() 
       { 
        Usage = "base colours", 
        Colours = new List<Colour>() 
        { 
         new Colour() { Name = "Red"}, 
         new Colour() { Name = "Blue"}, 
         new Colour() { Name = "Green"} 
        } 
       }, 
       new UsageType() 
       { 
        Usage = "accent colours", 
        Colours = new List<Colour>() 
        { 
         new Colour() { Name = "Red"}, 
         new Colour() { Name = "Blue"}, 
         new Colour() { Name = "Yellow"} 
        } 
       } 
      }; 

     var allColours = from clr in usageTypes 
         .SelectMany(ut => ut.Colours, (clr, ut) => new { colour = ut.Name, usage = clr.Usage }) 
         select new { clr.colour, clr.usage }; 
    } 
} 

Ce que je voudrais savoir comment obtenir de ma liste aplatie des couleurs (la variable allColours dans mon échantillon) à l'avoir structuré selon ma question. Toute aide sur la meilleure façon de le faire serait appréciée.

Répondre

1

GroupBy couleur vous donnera essentiellement le format souhaité:

var colourUsage = 
    from ut in usageTypes 
    from c in ut.Colours 
    group ut.Usage by c.Name into g 
    select new { colour = g.Key, usages = g.ToList() }; 
+0

parfait, c'est juste ce que je cherchais grâce. – JPT