6

言葉が正しくないかもしれませんが、これが私が持っているものであり、これが私が達成したい結果です:

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

材料ごとにケーキをグループ分けしたいと思います。だから私はこれで終わりたいと思います:

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

前もって感謝します!

4

3 に答える 3

8

クエリ内包表記が気にならない場合は、別の方法があります (スペルが修正されていることに注意してください)。

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

サプライズ!これは有効なクエリです。language-spec では、理解を group-by で終わらせることができます。はIGrouping<string,Cake>、技術的にはタイプのプロパティをIEnumerable<Cake>持つです。この場合は成分です。コンパイラは、これを他の回答のコードとほぼ同じコードに変換するように機能します。Keystring

intoクエリを変更して、他の回答と同様のジェネリック型を生成することができますselect

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

fluent-syntax と query-syntax はどちらも知っておく価値があります。乾杯!

于 2013-01-29T04:27:06.563 に答える
6
var ingrediants = cakes.SelectMany(c => c.Ingrediants.Select(i => new { Cake = c, Ingrediant = i }))
    .GroupBy(ci => ci.Ingrediant)

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

于 2013-01-28T22:57:25.930 に答える
4

これを行う1つの方法は次のとおりです。

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

resultIEnumerable匿名型になります。材料とそれを含むすべてのケーキを表す 1 つの要素。

于 2013-01-28T22:56:04.563 に答える