Menu
Coddy logo textTech

Ricerca con LINQ

Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 65 di 70.

challenge icon

Sfida

Facile

Aggiungiamo 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, Author e IsAvailable, insieme ai metodi Borrow() e Return().
  • User.cs: Mantieni la tua classe User con le funzionalità di tracciamento dei prestiti, tra cui MaxBooks, 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 disponibili
    • GetBorrowedBooks() - Restituisce tutti i libri attualmente presi in prestito
    Ogni metodo di ricerca dovrebbe restituire una raccolta di libri su cui è possibile eseguire un'iterazione.
  • 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 titolo
    • author|name - trova i libri di un autore
    • available - trova tutti i libri disponibili
    • borrowed - 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|Tolkien

L'output dovrebbe essere:

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

Un 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
available

L'output dovrebbe essere:

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

LINQ 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

Esercitati da solo: Compilatore C# online