Menu
Coddy logo textTech

LINQ para Búsquedas

Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy — lección 65 de 70.

challenge icon

Desafío

Fácil

¡Vamos a añadir potentes capacidades de búsqueda a tu Sistema de Biblioteca usando LINQ! Implementarás métodos que permitan a los usuarios encontrar libros por varios criterios: buscando por título, filtrando por autor y encontrando libros disponibles. LINQ hace que estas consultas sean elegantes y legibles.

Continuarás construyendo sobre la estructura de tu proyecto existente:

  • Book.cs: Mantén tu clase Book con las propiedades Id, Title, Author e IsAvailable, junto con los métodos Borrow() y Return().
  • User.cs: Mantén tu clase User con la funcionalidad de seguimiento de préstamos, incluyendo MaxBooks, CanBorrow() y los métodos para gestionar los libros prestados.
  • Library.cs: Aquí es donde añadirás tus métodos de búsqueda potenciados por LINQ. Además de tu lógica de préstamo existente, implementa estas capacidades de búsqueda:
    • SearchByTitle(string keyword) - Devuelve todos los libros donde el título contiene la palabra clave (sin distinguir entre mayúsculas y minúsculas)
    • GetBooksByAuthor(string author) - Devuelve todos los libros de un autor específico (coincidencia exacta, sin distinguir entre mayúsculas y minúsculas)
    • GetAvailableBooks() - Devuelve todos los libros que están actualmente disponibles
    • GetBorrowedBooks() - Devuelve todos los libros que están actualmente prestados
    Cada método de búsqueda debe devolver una colección de libros que pueda ser iterada.
  • Program.cs: Procesa las consultas de búsqueda y muestra los resultados.

Recibirás las siguientes entradas:

  • Nombre de la biblioteca
  • Número de libros, luego cada libro como id|title|author
  • Número de operaciones de préstamo para configurar el estado inicial, luego cada una como bookId
  • Un comando de búsqueda en uno de estos formatos:
    • title|keyword - buscar libros por palabra clave en el título
    • author|name - obtener libros por autor
    • available - obtener todos los libros disponibles
    • borrowed - obtener todos los libros prestados

Para los resultados de la búsqueda, imprime cada libro coincidente en su propia línea en el formato {Title} by {Author}. Si no hay libros que coincidan, imprime No books found. Los resultados deben imprimirse en el orden en que aparecen en la colección de la biblioteca.

Por ejemplo, si las entradas son:

City Library
5
B001|The Hobbit|Tolkien
B002|The Lord of the Rings|Tolkien
B003|1984|George Orwell
B004|Animal Farm|George Orwell
B005|The Silmarillion|Tolkien
2
B001
B003
author|Tolkien

La salida debería ser:

The Hobbit by Tolkien
The Lord of the Rings by Tolkien
The Silmarillion by Tolkien

Otro ejemplo con la misma configuración de biblioteca pero buscando libros disponibles:

City Library
5
B001|The Hobbit|Tolkien
B002|The Lord of the Rings|Tolkien
B003|1984|George Orwell
B004|Animal Farm|George Orwell
B005|The Silmarillion|Tolkien
2
B001
B003
available

La salida debería ser:

The Lord of the Rings by Tolkien
Animal Farm by George Orwell
The Silmarillion by Tolkien

LINQ transforma lo que serían bucles complejos en consultas expresivas y legibles. ¡Métodos como Where() para filtrar y ToList() para materializar los resultados harán que tu implementación de búsqueda sea limpia y fácil de mantener!

Pruébalo tú mismo

using System;
using System.Collections.Generic;

namespace LibrarySystem
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Leer el nombre de la biblioteca
            string libraryName = Console.ReadLine();
            
            // Crear una instancia de Library con el nombre de la biblioteca
            Library library = new Library(libraryName);
            
            // Leer el número de libros
            int numBooks = Convert.ToInt32(Console.ReadLine());
            
            // Leer y añadir libros
            for (int i = 0; i < numBooks; i++)
            {
                string bookInput = Console.ReadLine();
                string[] bookParts = bookInput.Split('|');
                string bookId = bookParts[0];
                string bookTitle = bookParts[1];
                string bookAuthor = bookParts[2];
                
                Book book = new Book(bookId, bookTitle, bookAuthor);
                library.AddBook(book);
            }
            
            // Leer el número de operaciones de préstamo para establecer el estado inicial
            int numBorrows = Convert.ToInt32(Console.ReadLine());
            
            // Procesar las operaciones de préstamo (solo IDs de libros)
            for (int i = 0; i < numBorrows; i++)
            {
                string bookId = Console.ReadLine();
                Book book = library.GetBookById(bookId);
                if (book != null)
                {
                    book.IsAvailable = false;
                }
            }
            
            // Leer el comando de búsqueda
            string searchCommand = Console.ReadLine();
            
            // Procesar el comando de búsqueda
            List<Book> results = new List<Book>();
            
            if (searchCommand == "available")
            {
                results = library.GetAvailableBooks();
            }
            else if (searchCommand == "borrowed")
            {
                results = library.GetBorrowedBooks();
            }
            else if (searchCommand.Contains("|"))
            {
                string[] parts = searchCommand.Split('|');
                string searchType = parts[0];
                string searchValue = parts[1];
                
                if (searchType == "title")
                {
                    results = library.SearchByTitle(searchValue);
                }
                else if (searchType == "author")
                {
                    results = library.GetBooksByAuthor(searchValue);
                }
            }
            
            // Imprimir los resultados
            if (results.Count == 0)
            {
                Console.WriteLine("No books found");
            }
            else
            {
                foreach (Book book in results)
                {
                    Console.WriteLine($"{book.Title} by {book.Author}");
                }
            }
        }
    }
}

Todas las lecciones de Programación Orientada a Objetos