2016-10-18 2 views
1

В моем коде у меня есть список объектов ObjectA, каждый из которых имеет список ObjectB. Я хотел бы получить один список всех ObjectB в моем списке ObjectAs.LINQ Конкатентные дочерние списки в списке

Если у меня есть это объекты:

public class ObjectA 
{ 
    public string Name {get; set;} 
    public List<ObjectB> Children {get; set;} 
} 

public class ObjectB 
{ 
    public string ChildName {get; set;} 
} 

И этот код:

void Main() 
{ 
    var myList = 
     new List<ObjectA>{ 
      new ObjectA{ 
       Name = "ItemA 1", 
       Children = new List<ObjectB>{ 
         new ObjectB{ChildName = "ItemB 1"}, 
         new ObjectB{ChildName = "ItemB 2"} 
        } 
      }, 
      new ObjectA{ 
       Name = "ItemA 2", 
       Children = new List<ObjectB>{ 
         new ObjectB{ChildName = "ItemB 3"}, 
         new ObjectB{ChildName = "ItemB 4"} 
        } 
      } 
     }; 
    // What code would I put here to concat all the ObjectBs? 
} 

Я хочу, чтобы получить List<ObjectB> с 4 ObjectB пунктов:

ItemB 1
ItemB 2
ItemB 3
ItemB 4

+0

В настоящее время существует «всего» 4 245 дубликатов (http://stackoverflow.com/search?q=%5Blinq%5Dselectmany) и по-прежнему задают этот тривиальный вопрос. –

+0

Извините, не мог вспомнить правильную терминологию. Было несколько запросов, но никаких результатов не сказано 'SelectMany'. –

+0

@MKenyonII Поиск [точная формулировка, которую вы использовали для своего названия] (https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=LINQ+Concat+child+ списки + в + + список) приводит к странице * полных * вопросов с этим ответом. – Servy

ответ

4
var allObjectB = myList.SelectMany(x=>x.Children).ToList(); 
8

Вы можете просто использовать SelectMany:

var result = mylist.SelectMany(a => a.Children).ToList(); 
0

Вот как я бы сделал это (прежде чем я увидел SelectMany ответы ...)

http://ideone.com/piypJq

// Create variable to store all ObjectB objects. 
var allObjB = new List<ObjectB>(); 

// Add all children from each ObjectA. 
myList.ForEach(x => allObjB.AddRange(x.Children)); 

// and confirm that they are all in allObjB 
allObjB.ForEach(x => Console.WriteLine(x.ChildName)); 
Смежные вопросы