0

次のものがあるとします。

public class ClassA
{
    public string Description {get;set;}
    public List<Product> Products {get;set;}
}

public class ClassB
{
    public string Description {get;set;}
    public Product SingleProduct {get;set;}
}

public class ClassC
{
    public List<ClassA> ListOfAs {get;set;}
    public List<ClassB> BreakDownListOfAs()
    {
        // This is the critical point
    }
}

マークされた重要なポイントで、各インスタンスが単一の製品を持ち、それが存在するインスタンスからを取得するように、それClassBを調べListOfAsて分解することで作成されたインスタンスのリストを返したいと考えています。ClassBDescriptionClassAProduct

例、私が持っている場合:

var ListOfAs = new List<ClassA> {
    new ClassA {
        Description = "foo",
        Products = new List<Product> { p1, p2 }
    },
    new ClassA {
        Description = "bar",
        Products = new List<Product> { p3, p4 }
    }
};

次に、の戻り値がClassC.BreakDownListOfAs()一致する必要があります。

new List<ClassB> {
    new ClassB { Description = "foo", Product = p1 },
    new ClassB { Description = "foo", Product = p2 },
    new ClassB { Description = "bar", Product = p3 },
    new ClassB { Description = "bar", Product = p4 },
}

通常、サブリストの射影に使用することは知っていますが.SelectMany()、射影されたサブ要素を親オブジェクトの文字列で構成する方法がわかりません。

4

3 に答える 3

3

LINQ メソッド チェーンでは、次のようになります。

return ListOfAs
    .SelectMany(a => a.Products,
                (a, p) => new ClassB
                                {
                                    Description = a.Description,
                                    SingleProduct = p
                                })
    .ToList();

秘訣は、ClassA インスタンスの記述と ClassA のリストの Product の両方を使用して、結果セレクターでオブジェクトを作成することです。

于 2013-04-18T17:22:15.327 に答える
1
IEnumerable<ClassB> breakdown =
    ListOfAs.Select(a => a.Products.Select(
                         p => new ClassB { Description = a.Description,
                                           SingleProduct = p }))
    .SelectMany(b => b);
于 2013-04-18T17:28:39.067 に答える