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和分解它创建的实例列表,这样每个实例ClassB都有一个产品,并且Description来自它所在的ClassA实例Product

例如,如果我有:

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 回答
3

使用 LINQ 语法非常简单:

var query = from a in listOfAs
            from p in a.Products
            select new ClassB
            {
                Description = a.Description,
                SingleProduct = p
            };

var result = query.ToList();
于 2013-04-18T17:18:30.280 回答
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 回答