Función usada para imprimir los agrupamientos por año
voidImprimirGrupo(IEnumerable<IGrouping<int,Book>>ListadeLibros){foreach(var grupo inListadeLibros){Console.WriteLine("");Console.WriteLine($"Grupo: { grupo.Key }");Console.WriteLine("{0,-60} {1, 15} {2, 15}\n","Titulo","N. Paginas","Fecha publicacion");foreach(var item in grupo){Console.WriteLine("{0,-60} {1, 15} {2, 15}",item.Title,item.PageCount,item.PublishedDate.Date.ToShortDateString());}}}
Cláusula GroupBy
Permite agrupar los datos por una propiedad.
Query
public IEnumerable<IGrouping<int,Book>>booksAfter2000GroupByYearQuery(IEnumerable<Book>books){
return from b in books where b.PublishedDate.Year>=2000 group b by b.PublishedDate.Year;
}
Se puede modificar la función imprimirValores() que hemos estado usando para imprimir la lista de libros, para que reciba: un libro, una lista de libros o una lista de listas de libros (es lo que devuelve el groupBy):
Agregamos la funcion BookListPrint() para reutilizar algunas lineas de código que se repiten:
voidBookListPrint(IEnumerable<Book> listBooks){foreach(Book book in listBooks){Console.WriteLine("{0,-60} {1,15} {2,15}", book.Title, book.PageCount, book.PublishedDate.ToShortDateString());}}
Y finalmente llamamos la función pasando los(el) elementos que necesitamos y los demás en null:
voidImprimirGrupo(IEnumerable<IGrouping<int, Book>> ListaDeLibros){foreach(var grupo in ListaDeLibros){ Console.WriteLine(""); Console.WriteLine($"*************** Año: {grupo.Key} ***************"); Console.WriteLine("{0,-60} {1, 15} {2, 15}\n","Título","N. Páginas","Fecha publicación");foreach(var item in grupo){ Console.WriteLine("{0,-60} {1, 15} {2, 15}", item.Title, item.PageCount, item.PublishedDate);}}}// retornar todos los libros que fueron publicados a partir del 2000// agrupados por aniopublic IEnumerable<IGrouping<int, Book>>LibrosDespuesDel2000AgrupadosPorAno(){return librosCollection
.Where(p => p.PublishedDate.Year >=2000).GroupBy(p => p.PublishedDate.Year);}
Esta seria una mejor manera de ordenar los datos de los grupos:
he usado ambas formas,
publicIEnumerable<IGrouping<int,Book>>GetBooksPublishedAndGroupByYear(int year){//extension method// return CollectionBook// .Where(book => book.PublishedDate.Year >= year)// .OrderBy(book => book.PublishedDate.Year)// .ThenBy(book => book.PublishedDate.Month)// .GroupBy(book => book.PublishedDate.Year);//linq queryreturnfrom book inCollectionBook where book.PublishedDate.Year>= year
orderby book.PublishedDate.Year, book.PublishedDate.Month group book by book.PublishedDate.Year;}
//AGREGANDO UN FILTRO MAS NUMERO DE PÁGINAS
public IEnumerable<IGrouping<int,Book>> LibrosAgrupadosPorAno(){