Ricerca con LINQ
Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 65 di 70.
Sfida
FacileAggiungiamo potenti funzionalità di ricerca al tuo Library System usando LINQ! Implementerai metodi che consentono agli utenti di trovare libri in base a vari criteri: ricerca per titolo, filtro per autore e ricerca dei libri disponibili. LINQ rende queste query eleganti e leggibili.
Continuerai a basarti sulla struttura del progetto esistente:
Book.cs: Mantieni la tua classe Book con le proprietàId,Title,AuthoreIsAvailable, insieme ai metodiBorrow()eReturn().User.cs: Mantieni la tua classe User con le funzionalità di tracciamento dei prestiti, tra cuiMaxBooks,CanBorrow()e i metodi per gestire i libri presi in prestito.Library.cs: Qui aggiungerai i metodi di ricerca basati su LINQ. Oltre alla logica di prestito esistente, implementa queste funzionalità di ricerca:SearchByTitle(string keyword)- Restituisce tutti i libri il cui titolo contiene la parola chiave (senza distinzione tra maiuscole e minuscole)GetBooksByAuthor(string author)- Restituisce tutti i libri di un autore specifico (corrispondenza esatta, senza distinzione tra maiuscole e minuscole)GetAvailableBooks()- Restituisce tutti i libri attualmente disponibiliGetBorrowedBooks()- Restituisce tutti i libri attualmente presi in prestito
Program.cs: Elabora le query di ricerca e mostra i risultati.
Riceverai i seguenti input:
- Nome della biblioteca
- Numero di libri, seguito da ciascun libro nel formato
id|title|author - Numero di operazioni di prestito per impostare lo stato iniziale, seguite da ciascuna nel formato
bookId - Un comando di ricerca in uno dei seguenti formati:
title|keyword- cerca i libri usando una parola chiave del titoloauthor|name- trova i libri di un autoreavailable- trova tutti i libri disponibiliborrowed- trova tutti i libri presi in prestito
Per i risultati della ricerca, stampa ogni libro corrispondente su una riga separata nel formato {Title} by {Author}. Se nessun libro corrisponde, stampa No books found. I risultati devono essere stampati nell'ordine in cui i libri appaiono nella raccolta della biblioteca.
Per esempio, se gli input sono:
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|TolkienL'output dovrebbe essere:
The Hobbit by Tolkien
The Lord of the Rings by Tolkien
The Silmarillion by TolkienUn altro esempio con la stessa configurazione della biblioteca, ma con una ricerca dei libri disponibili:
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
availableL'output dovrebbe essere:
The Lord of the Rings by Tolkien
Animal Farm by George Orwell
The Silmarillion by TolkienLINQ trasforma cicli complessi in query espressive e leggibili. Metodi come Where() per filtrare e ToList() per materializzare i risultati renderanno l'implementazione della ricerca chiara e facile da mantenere!
Provalo tu
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Leggi il nome della biblioteca
string libraryName = Console.ReadLine();
// Crea un'istanza di Library con il nome della biblioteca
Library library = new Library(libraryName);
// Leggi il numero di libri
int numBooks = Convert.ToInt32(Console.ReadLine());
// Leggi e aggiungi i libri
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);
}
// Leggi il numero di operazioni di prestito per impostare lo stato iniziale
int numBorrows = Convert.ToInt32(Console.ReadLine());
// Elabora le operazioni di prestito (solo gli ID dei libri)
for (int i = 0; i < numBorrows; i++)
{
string bookId = Console.ReadLine();
Book book = library.GetBookById(bookId);
if (book != null)
{
book.IsAvailable = false;
}
}
// Leggi il comando di ricerca
string searchCommand = Console.ReadLine();
// Elabora il comando di ricerca
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);
}
}
// Stampa i risultati
if (results.Count == 0)
{
Console.WriteLine("No books found");
}
else
{
foreach (Book book in results)
{
Console.WriteLine($"{book.Title} by {book.Author}");
}
}
}
}
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniNamespace e direttiveIntroduzione a classi e oggettiLa parola chiave "this"Metodi e parametriCampi e proprietàCostruttoriInizializzatori di oggettiRiepilogo - Calcolatrice semplice4Ereditarietà
Sintassi di base dell'ereditarietà (:)La parola chiave 'base'Parole chiave virtual e overrideClassi sealedLa classe base 'object'Riepilogo - Gerarchia dei dipendenti7Funzionalità avanzate
Sovraccarico degli operatoriIndicizzatori (this[])Override di ToString()Metodi di estensioneRiepilogo - Lista personalizzata10Pattern di progettazione Parte 1
Introduzione ai pattern di progettazioneSingleton thread-safePattern FactoryPattern Observer (eventi)Pattern Strategy2Proprietà e membri statici
Proprietà implementate automaticamenteProprietà di sola lettura e di sola scritturaCampi e metodi staticiClassi staticheMembri con corpo di espressione5Polimorfismo e interfacce
Polimorfismo a compile time e runtimeInterfaccia o classe astrattaInterfacce multipleInterfacce espliciteUpcasting e downcastingRipasso: calcolatore di forme8Concetti avanzati di programmazione a oggetti
Composizione invece dell'ereditarietàTipi generici (classi e metodi)Delegati ed eventiAttributi e reflectionIDisposable e istruzione usingNozioni di base sull'iniezione delle dipendenze11Pattern di progettazione, parte 2
Pattern del ComandoPattern dell’AdattatorePattern del DecoratorePattern Template MethodPattern dello StatoPattern Composito3Architettura delle classi
Dati di istanza vs staticiParole chiave 'readonly' e 'const'Campi di supportoRiepilogo - Gestore di conti bancari6Incapsulamento
Modificatori di accessoProprietà per l'incapsulamentoImplementazione dell'occultamento dei datiModelli di immutabilitàRiepilogo - Registri degli studenti9Argomenti variabili
La parola chiave 'params'Parametri opzionaliArgomenti con nomeOverloading dei metodi12Progetto: Sistema bibliotecario
Struttura del progettoModelli di libri e utentiLogica del sistema di prestitoRicerca con LINQInterfaccia console / interfaccia amministratoreTest unitari (NUnit/xUnit)Esercitati da solo: Compilatore C# online