2013-01-28 10 views
5

potrebbe non essere formulati perfettamente ragione, ma qui è quello che ho ed ecco il risultato che voglio raggiungere:utilizzando LINQ, come GroupBy contro gli oggetti in un elenco all'interno dell'oggetto di destinazione

class Cake 
{ 
public List<string> Ingrediants {get;set;} 
public DateTime Baked {get;set;} 
public string CakeName {get;set;} 
} 

List<Cake> cakes= new List<Cake>(); 
cakes.Add(new Cake() {CakeName = "Cake1", Ingrediants = new List<string>() {"Sugar", "Chocolate"}}); 
cakes.Add(new Cake() {CakeName = "Cake2", Ingrediants = new List<string>() {"Sugar", "Butter"}}); 
cakes.Add(new Cake() {CakeName = "Cake3", Ingrediants = new List<string>() {"Stevia", "Butter"}}); 

Vorrei gruppo le torte di ingrediant. Quindi mi piacerebbe finire con questo:

- Sugar 
     Cake1 
     Cake2 
- Stevia 
     Cake3 
- Chocolate 
     Cake1 
- Butter 
     Cake2 
     Cake3 

Grazie in anticipo!

+0

Cosa vuoi, GroupBy o OrderBy? Inoltre non è chiaro come siano ordinati i dolci. –

+0

Voglio raggrupparli usando GroupBy su ingrediant. L'ordine della torta non è importante – Tom

risposta

8

Se non ti dispiace comprensioni di query, ecco un'alternativa (nota ortografia corretti):

IEnumerable<IGrouping<string,Cake>> query = 
    from cake in cakes 
    from ingredient in cake.Ingredients 
    group cake by ingredient; 

Sorpresa! Questa è una query valida! Le specifiche del linguaggio consentono alle intese di terminare con un gruppo. Il IGrouping<string,Cake> è tecnicamente un IEnumerable<Cake> che ha una proprietà Key di tipo string - in questo caso l'ingrediente. Il compilatore lavora per trasformarlo in un codice quasi identico a quello delle altre risposte.

Potremmo modificare la query per generare lo stesso tipo generico simile alle altre risposte introducendo un into e una clausola select che funziona fuori la query di continuazione:

var query = 
    from cake in cakes 
    from ingredient in cake.Ingredients 
    group cake by ingredient into cakesGrouped 
    select new { Ingredient = cakesGrouped.Key, 
     Cakes = cakesGrouped.ToList() }; 

Sia fluente-sintassi e query- la sintassi vale la pena conoscere, IMHO. Saluti!

+2

+1 Nice, la sintassi delle query è più leggibile in questo caso. – GolfWolf

4

Ecco un modo per farlo:

var result = cakes 
    .SelectMany(c => c.Ingrediants.Select(i => new 
     { 
      c.CakeName, 
      Ingredient = i 
     })) 
    .GroupBy(x => x.Ingredient) 
    .Select(g => new 
     { 
      Ingredient = g.Key, 
      Cakes = g.Select(x=>x.CakeName).ToArray() 
     }); 

result sarà un IEnumerable di un tipo anonimo; un elemento che rappresenta un ingrediente e tutte le torte che lo contengono.

+0

Grazie per l'input. Lo segnerei come corretto ma Lee ti ha battuto di un minuto o 2. – Tom

+1

@Tom FWIW, non è vero. Quando vuoi trovare le prime risposte usando LINQ dovresti fare 'answers.Min (a => a.Time)', non 'Max' :-) – GolfWolf

6
var ingrediants = cakes.SelectMany(c => c.Ingrediants.Select(i => new { Cake = c, Ingrediant = i })) 
    .GroupBy(ci => ci.Ingrediant) 

Quindi la chiave di gruppo è il nome dell'ingrediente e la raccolta di gruppo è la torta corrispondente.

Problemi correlati