No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Aprende Inglés, Programación, AI, Ciberseguridad y mucho más.

Antes: $249

Currency
$209
Suscríbete

Termina en:

5 Días
9 Hrs
15 Min
13 Seg

Cláusula GroupBy

22/26
Recursos

Aportes 9

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Función usada para imprimir los agrupamientos por año

void ImprimirGrupo(IEnumerable<IGrouping<int,Book>> ListadeLibros)
{
    foreach(var grupo in ListadeLibros)
    {
        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()); 
        }
    }
}

Aproveche y añadí el ordenamiento de los resultados

Y modifique un poco la función que imprime los resultados

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

Podemos poner el año como parámetro:

public IEnumerable<IGrouping<int, Book>> LibrosAPartirDeAnioAgrupadosPorAnio(int anio)
        {
            return librosCollection.Where(book => book.PublishedDate.Year >= anio).OrderBy(book => book.PublishedDate).GroupBy(book => book.PublishedDate.Year);
        }

//* Libros publicados a partir del 2000 agrupados por año
        ImprimirGrupo(queries.LibrosAPartirDeAnioAgrupadosPorAnio(2000));
```c# void ImprimirGrupo(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 anio public 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,

public IEnumerable<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 query
        return from book in CollectionBook 
           where book.PublishedDate.Year >= year
           orderby book.PublishedDate.Year, book.PublishedDate.Month
           group book by book.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):


void printValues(IEnumerable<Book> listBooks, Book aBook, IEnumerable<IGrouping<int, Book>> ListBooksGrouped)
{
    Console.WriteLine("{0,-60} {1,15} {2,15}\n", "Titulo", "N paginas", "Fecha Publicacion");
    if (listBooks != null)
    {
        BookListPrint(listBooks);
    }
    else if (aBook != null)
    {
        Console.WriteLine("{0,-60} {1,15} {2,15}", aBook.Title, aBook.PageCount, aBook.PublishedDate.ToShortDateString());
    }
    else if (ListBooksGrouped != null)
    {
        foreach (var group in ListBooksGrouped)
        {
            Console.WriteLine("\n Grupo: " + group.Key);
            BookListPrint(group);
        }
    }
}

Agregamos la funcion BookListPrint() para reutilizar algunas lineas de código que se repiten:

void BookListPrint(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:

printValues(null, null, queries.AllBooksSince2000GruopByYear());

//AGREGANDO UN FILTRO MAS NUMERO DE PÁGINAS
public IEnumerable<IGrouping<int,Book>> LibrosAgrupadosPorAno(){

    return libros.Where(p=>p.PublishedDate.Year>200 && p.PageCount>=100).GroupBy(p=>p.PublishedDate.Year);
}