从 Linq 中其他列表的项创建列表

本文关键字:列表 创建 其他 Linq | 更新日期: 2023-09-27 18:33:51

我有一个自定义汽车对象的列表List<Car> .汽车类有两个属性"品牌名称"和"型号",定义如下。

public class Car
{
     public string BrandName {get; set;}
     public List<string> Models {get; set;}
}

"列表"对象的数据从 API 填充,如下所示。它返回接近 200 行。为了便于说明,该对象已使用以下两个项实例化。对象是使用此结构从 API 返回的,我无法控制数据的结构化和发送方式。

List<Car> listCarObj = new List<Car>(){
    new Car(){ BrandName = "Mercedes", Models = new List<string>(){"Class A", "Class E"}},
    new Car(){ BrandName = "BMW", Models = new List<string>(){"X Series", "E Series"}}
} 

如何使用 Linq 将此列表转换为具有以下格式数据的 IEnumerable 或其他匿名类型的列表?

var obj = new[] {new {brand = "Mercedes", model = "Class A"},
                 new {brand = "Mercedes", model = "Class E"},
                 new {brand = "BMW", model = "X Series"},
                 new {brand = "BMW", model = "E Series"}};

提前谢谢..

从 Linq 中其他列表的项创建列表

这是一种带有SelectMany和嵌套Select的方法

var result = listCarObj.SelectMany(x => x.Models.Select(y => new { model = y,brand = x.BrandName }));

为什么不进行 linq 查询,在该查询中,从listCarObj中选择每个对象,然后对于列表中的每个元素,获取所有模型并返回匿名类型?

像这样:

var obj = from p in listCarObj
          from q in p.Models
          select new {
            brand=p.BrandName,
            model = q
            };

您可以使用 SelectMany 来展平您的Models,然后像这样投影:

var result = listCarObj.SelectMany(x => x.Models, 
                                       (carObj, model) => new { 
                                                                 carObj.BrandName, model 
                                                              });