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 avançados de pesquisa ao seu Sistema de Biblioteca usando LINQ! Você implementará métodos que permitem aos usuários encontrar livros por vários critérios — pesquisando por título, filtrando por autor e encontrando livros disponíveis. LINQ torna essas consultas elegantes e fáceis de ler.

Você continuará desenvolvendo com base na estrutura existente do seu projeto:

  • Book.cs: Mantenha sua classe Book com as propriedades Id, Title, Author e IsAvailable, juntamente com os métodos Borrow() e Return().
  • User.cs: Mantenha sua classe User com a funcionalidade de controle de empréstimos, incluindo MaxBooks, CanBorrow() e os métodos para gerenciar livros emprestados.
  • Library.cs: É aqui que você adicionará seus métodos de pesquisa usando LINQ. Além da lógica de empréstimos existente, implemente estes recursos de pesquisa:
    • SearchByTitle(string keyword) - Retorna todos os livros cujo título contém a palavra-chave, sem diferenciar maiúsculas de minúsculas
    • GetBooksByAuthor(string author) - Retorna todos os livros de um autor específico, com correspondência exata e sem diferenciar maiúsculas de 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 pesquisa deve retornar uma coleção de livros que possa ser percorrida.
  • Program.cs: Processe as consultas de pesquisa e exiba os resultados.

Você receberá as seguintes entradas:

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

Para os resultados da pesquisa, 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 deverá 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 pesquisando 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 deverá ser:

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

LINQ transforma o que seriam loops complexos em consultas expressivas e fáceis de ler. Métodos como Where() para filtragem e ToList() para materializar resultados tornarão sua implementação de pesquisa 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

Pratique por conta própria: Compilador de C# online