J'essaye d'aplatir les objets imbriqués comme ceci:
public class Book
{
public string Name { get; set; }
public IList<Chapter> Chapters { get; set; }
}
public class Chapter
{
public string Name { get; set; }
public IList<Page> Pages { get; set; }
}
public class Page
{
public string Name { get; set; }
}
Laissez-moi faire un exemple. Ce sont les données que j'ai
Book: Pro Linq
{
Chapter 1: Hello Linq
{
Page 1,
Page 2,
Page 3
},
Chapter 2: C# Language enhancements
{
Page 4
},
}
Le résultat que je recherche est la liste plate suivante:
"Pro Linq", "Hello Linq", "Page 1"
"Pro Linq", "Hello Linq", "Page 2"
"Pro Linq", "Hello Linq", "Page 3"
"Pro Linq", "C# Language enhancements", "Page 4"
Comment pourrais-je accomplir cela? Je pourrais le faire avec un nouveau select mais on m'a dit qu'un SelectMany suffirait.
.Select(p => new FlatBook(b.Name, c.Name, p.Name))
myBooks.SelectMany(b => b.Chapters).SelectMany(c => c.Pages).Select(p => b.Name + ", " + c.Name + ", " + p.Name);
myBooks.SelectMany(b => b.Chapters == null || !b.Chapters.Any()? new []{b.Name + " has no Chapters"} : b.SelectMany(c => c.Pages.Select(p => b.Name + ", " + c.Name + ", " + p.Name)));
En supposant
books
une liste de livres:la source
IEnumerable<Book>
fera l'affaire, n'a pas besoin d'unList<Book>
.la source
J'essayais de le faire aussi, et d'après les commentaires de Yuriy et le fait de jouer avec linqPad, j'ai ceci ...
Notez que je n'ai pas de livres, chapitres, pages, j'ai personne (livres), entreprisePersonne (chapitres) et entreprises (pages)
ou
Site de référence que j'ai utilisé: http://odetocode.com/blogs/scott/archive/2008/03/25/inner-outer-lets-all-join-together-with-linq.aspx
la source