Да, это SelectMany
. Давайте рассмотрим простой пример:
class C
{
public string Name { get; set; }
public IEnumerable<string> Subs { get; set; }
}
Теперь давайте сделаем их несколько.
var cs = new List<C> {
new C { Name = "Alice", Subs = new List<string> { "Orange", "Green" }},
new C { Name = "Bobby", Subs = new List<string> { "Red", "Blue" }}
}
То есть у нас есть
Alice
Orange
Green
Bobby
Red
Blue
Вы хотите новый список
Alice
Orange
Alice
Green
Bobby
Red
Bobby
Blue
Правильно?
В любое время, когда вы хотите «сгладить» список списков, вы используете SelectMany. Либо в форме понимания:
var query =
from c in cs
from s in c.Subs
select new C { Name = c.Name, Subs = new List<string> { s } };
Или в беглой форме
var query =
cs.SelectMany(
c => c.Subs,
(c, s) => new C { Name = c.Name, Subs = new List<string> { s } });
, которая, как вы можете видеть, имеет такую же структуру, только немного сложнее для чтения.
Если вам нужен список на другом конце:
var newList = query.ToList();
И все готово.