LINQ para Buscas
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 65 de 70.
Desafio
FácilVamos 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 propriedadesId,Title,AuthoreIsAvailable, junto com os métodosBorrow()eReturn().User.cs: Mantenha sua classe User com a funcionalidade de rastreamento de empréstimos, incluindoMaxBooks,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 momentoGetBorrowedBooks()- Retorna todos os livros que estão emprestados no momento
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ítuloauthor|name- obter livros por autoravailable- obter todos os livros disponíveisborrowed- 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|TolkienA saída deve ser:
The Hobbit by Tolkien
The Lord of the Rings by Tolkien
The Silmarillion by TolkienOutro 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
availableA saída deve ser:
The Lord of the Rings by Tolkien
Animal Farm by George Orwell
The Silmarillion by TolkienO 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
1Fundamentos de POO
Arquivos ExternosNamespaces e DiretivasIntrodução a Classes e ObjetosA Palavra-chave 'this'Métodos e ParâmetrosCampos vs PropriedadesConstrutoresInicializadores de ObjetosRecapitulação - Calculadora Simples4Herança
Sintaxe Básica de Herança (:)A Palavra-chave 'base'Palavras-chave Virtual e OverrideClasses SeladasA Classe Base 'object'Recapitulação - Hierarquia de Funcionários7Recursos Avançados
Sobrecarga de OperadoresIndexadores (this[])Sobrescrita de ToString()Métodos de ExtensãoRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoSingleton Thread-SafePadrão FactoryPadrão Observer (Eventos)Padrão Strategy2Propriedades e Membros Estáticos
Propriedades AutoimplementadasPropriedades de Apenas Leitura/EscritaCampos e Métodos EstáticosClasses EstáticasMembros com Corpo de Expressão5Polimorfismo e Interfaces
Polimorfismo: Compilação vs ExecuçãoInterface vs Classe AbstrataMúltiplas InterfacesInterfaces ExplícitasUpcasting e DowncastingRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição sobre HerançaGenerics (Classes e Métodos)Delegates e EventosAtributos e ReflectionIDisposable e a Instrução usingFundamentos de Injeção de Dependência11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Arquitetura de Classes
Dados de Instância vs EstáticosPalavras-chave 'readonly' e 'const'Campos de SuporteRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Modificadores de AcessoPropriedades para EncapsulamentoImplementação de Ocultação de DadosPadrões de ImutabilidadeRecapitulação - Registros de Estudantes9Argumentos Variáveis
A Palavra-chave 'params'Parâmetros OpcionaisArgumentos NomeadosSobrecarga de Métodos12Projeto: Sistema de Biblioteca
Estrutura do ProjetoModelos de Livro e Usuário