关于c#:从Linq中的另一个列表项创建列表

Creating lists from another list's item in Linq

本问题已经有最佳答案,请猛点这里访问。

我有一个定制汽车对象的列表List。car类有两个属性"brandname"和"models",定义如下。

1
2
3
4
5
public class Car
{
     public string BrandName {get; set;}
     public List<string> Models {get; set;}
}

"list"对象的数据是从下面的API填充的。它返回近200行。为了便于说明,对象已用以下两项进行了实例化。对象从具有此结构的API返回,我无法控制数据的结构和发送方式。

1
2
3
4
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或具有以下格式数据的匿名类型的其他列表?

1
2
3
4
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"}};

提前谢谢……


这里是一个使用SelectMany和嵌套Select的方法

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

为什么不做一个LINQ查询,从listCarObj中选择每个对象,并为列表中的每个元素获取所有模型并返回一个匿名类型?

类似:

1
2
3
4
5
6
var obj = from p in listCarObj
          from q in p.Models
          select new {
            brand=p.BrandName,
            model = q
            };


您可以使用selectmany将您的Models展平,然后按如下方式投影:

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