2016-02-08 3 views
1

У меня есть список пользовательских объектов автомобиля List<Car>. Класс автомобиля имеет два свойства «BrandName» и «Модели», как определено ниже.Создание списков из другого списка в Linq

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

Как преобразовать этот список в виде IEnumerable или другой список анонимного типа, имеющего данные в указанном ниже формате, используя Linq?

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

Заранее спасибо ..

+0

Я сомневаюсь, что дубликаты совпадают, как в ментио ned post OP запрашивает «родительский узел» для данного подузла, а не для всех дочерних элементов внутри родителя. – HimBromBeere

+3

@HimBromBeere, справа, не лучший дубликат, содержащий 'SelectMany'. Как насчет [этого] (http://stackoverflow.com/q/6428940/1997232), то? – Sinatr

+0

@ Синат подходит гораздо лучше, я думаю. – HimBromBeere

ответ

5

здесь является подход с SelectMany и вложенным Select

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

Почему вы не сделать Linq запрос, в котором вы выбираете любой объект из listCarObj и для каждого элемента из списка, получить все модели и возврат анонимный тип?

Что-то вроде:

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

Вы можете использовать SelectMany сглаживаться ваш Models, а затем спроецировать это следующим образом: -

var result = listCarObj.SelectMany(x => x.Models, 
             (carObj, model) => new { 
                   carObj.BrandName, model 
                   }); 
Смежные вопросы