Menu
Coddy logo textTech

LINQ para Buscas

Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 65 de 70.

challenge icon

Desafio

Fácil

Vamos adicionar recursos de busca poderosos ao seu Sistema de Biblioteca usando LINQ! Você implementará métodos que permitem aos usuários encontrar livros por vários critérios - buscando por título, filtrando por autor e encontrando livros disponíveis. O LINQ torna essas consultas elegantes e legíveis.

Você continuará construindo sobre a estrutura do seu projeto existente:

  • Book.cs: Mantenha sua classe Book com as propriedades Id, Title, Author e IsAvailable, junto com os métodos Borrow() e Return().
  • User.cs: Mantenha sua classe User com a funcionalidade de rastreamento de empréstimos, incluindo MaxBooks, CanBorrow() e os métodos para gerenciar livros emprestados.
  • Library.cs: É aqui que você adicionará seus métodos de busca baseados em LINQ. Além da sua lógica de empréstimo existente, implemente estes recursos de busca:
    • SearchByTitle(string keyword) - Retorna todos os livros onde o título contém a palavra-chave (insensível a maiúsculas e minúsculas)
    • GetBooksByAuthor(string author) - Retorna todos os livros de um autor específico (correspondência exata, insensível a maiúsculas e minúsculas)
    • GetAvailableBooks() - Retorna todos os livros que estão disponíveis no momento
    • GetBorrowedBooks() - Retorna todos os livros que estão emprestados no momento
    Cada método de busca deve retornar uma coleção de livros que possa ser iterada.
  • Program.cs: Processa as consultas de busca e exibe os resultados.

Você receberá as seguintes entradas:

  • Nome da biblioteca
  • Número de livros, depois cada livro como id|title|author
  • Número de operações de empréstimo para configurar o estado inicial, depois cada uma como bookId
  • Um comando de busca em um destes formatos:
    • title|keyword - buscar livros por palavra-chave no título
    • author|name - obter livros por autor
    • available - obter todos os livros disponíveis
    • borrowed - obter todos os livros emprestados

Para os resultados da busca, imprima cada livro correspondente em sua própria linha no formato {Title} by {Author}. Se nenhum livro corresponder, imprima No books found. Os resultados devem ser impressos na ordem em que aparecem na coleção da biblioteca.

Por exemplo, se as entradas forem:

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

A saída deve ser:

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

Outro exemplo com a mesma configuração de biblioteca, mas buscando por livros disponíveis:

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

A saída deve ser:

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

O LINQ transforma o que seriam loops complexos em consultas expressivas e legíveis. Métodos como Where() para filtragem e ToList() para materializar resultados tornarão sua implementação de busca limpa e fácil de manter!

Experimente você mesmo

using System;
using System.Collections.Generic;

namespace LibrarySystem
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Ler o nome da biblioteca
            string libraryName = Console.ReadLine();
            
            // Criar uma instância de Library com o nome da biblioteca
            Library library = new Library(libraryName);
            
            // Ler o número de livros
            int numBooks = Convert.ToInt32(Console.ReadLine());
            
            // Ler e adicionar livros
            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);
            }
            
            // Ler o número de operações de empréstimo para configurar o estado inicial
            int numBorrows = Convert.ToInt32(Console.ReadLine());
            
            // Processar operações de empréstimo (apenas IDs dos livros)
            for (int i = 0; i < numBorrows; i++)
            {
                string bookId = Console.ReadLine();
                Book book = library.GetBookById(bookId);
                if (book != null)
                {
                    book.IsAvailable = false;
                }
            }
            
            // Ler o comando de busca
            string searchCommand = Console.ReadLine();
            
            // Processar o comando de busca
            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 resultados
            if (results.Count == 0)
            {
                Console.WriteLine("No books found");
            }
            else
            {
                foreach (Book book in results)
                {
                    Console.WriteLine($"{book.Title} by {book.Author}");
                }
            }
        }
    }
}

Todas as lições de Programação Orientada a Objetos