2013-01-28 5 views
5

はかなり右文言ではないかもしれませんが、ここで私が持っているものだと、ここで私が達成したい結果です:は、ターゲット・オブジェクト内のリスト内のオブジェクトに対してGROUPBYする方法

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

は私がグループたいですケーキはingrediantによって。だから私はこれで終わりたいと思います:

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

ありがとうございます!ここで

+0

GroupByまたはOrderByはどうしますか?ケーキの注文方法も明確ではありません。 –

+0

私はそれらをグループのGroupByを使ってグループ化したいと思っています。ケーキの注文は重要ではありません – Tom

答えて

8

は、ここで代替(補正スペルに注意)です!これは有効なクエリです!言語仕様により、理解はグループ単位で終わることができます。 IGrouping<string,Cake>は、string - この場合は成分のKeyの特性を持つ、技術的にはIEnumerable<Cake>です。コンパイラはこれを他の回答とほぼ同じコードに変換します。

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

両方堪能-構文とquery-:

我々はintoとクエリ継続をオフに動作select句を導入することにより、他の回答に似て同じジェネリック型を生成するためのクエリを変更することができ構文は知っておく価値がある、IMHO。乾杯!

+2

+1この場合、クエリの構文がわかりやすくなります。 – GolfWolf

4

はそれを行うための一つの方法です:

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は匿名型のIEnumerableになります。 1つの要素は成分を表し、それを含むすべてのケーキを表します。

+0

入力いただきありがとうございます。私はこれを正しいとマークしたいが、Leeは1分または2分であなたを打ち負かす。 – Tom

+1

@Tom FWIW、そうではない。あなたがLINQを使って最も早い回答を見つけたいときは、 'Max'ではなく' answers.Min(a => a.Time) 'を実行するべきです: – GolfWolf

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

次に、グループキーは成分名であり、グループコレクションは一致するケーキです。

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

サプライズ:あなたは、クエリの内包表記を気にしない場合は

関連する問題