Menu
Coddy logo textTech

LINQ pour la recherche

Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy — leçon 65 sur 70.

challenge icon

Défi

Facile

Ajoutons de puissantes capacités de recherche à votre système de bibliothèque en utilisant LINQ ! Vous allez implémenter des méthodes qui permettent aux utilisateurs de trouver des livres selon divers critères : recherche par titre, filtrage par auteur et recherche de livres disponibles. LINQ rend ces requêtes élégantes et lisibles.

Vous continuerez à construire sur la structure de votre projet existant :

  • Book.cs : Conservez votre classe Book avec les propriétés Id, Title, Author et IsAvailable, ainsi que les méthodes Borrow() et Return().
  • User.cs : Conservez votre classe User avec la fonctionnalité de suivi des emprunts, incluant MaxBooks, CanBorrow() et les méthodes de gestion des livres empruntés.
  • Library.cs : C'est ici que vous ajouterez vos méthodes de recherche propulsées par LINQ. En plus de votre logique d'emprunt existante, implémentez ces capacités de recherche :
    • SearchByTitle(string keyword) - Retourne tous les livres dont le titre contient le mot-clé (insensible à la casse)
    • GetBooksByAuthor(string author) - Retourne tous les livres d'un auteur spécifique (correspondance exacte, insensible à la casse)
    • GetAvailableBooks() - Retourne tous les livres qui sont actuellement disponibles
    • GetBorrowedBooks() - Retourne tous les livres qui sont actuellement empruntés
    Chaque méthode de recherche doit retourner une collection de livres pouvant être parcourue.
  • Program.cs : Traite les requêtes de recherche et affiche les résultats.

Vous recevrez les entrées suivantes :

  • Nom de la bibliothèque
  • Nombre de livres, puis chaque livre sous la forme id|title|author
  • Nombre d'opérations d'emprunt pour configurer l'état initial, puis chaque opération sous la forme bookId
  • Une commande de recherche dans l'un de ces formats :
    • title|keyword - rechercher des livres par mot-clé dans le titre
    • author|name - obtenir les livres par auteur
    • available - obtenir tous les livres disponibles
    • borrowed - obtenir tous les livres empruntés

Pour les résultats de recherche, affichez chaque livre correspondant sur sa propre ligne au format {Title} by {Author}. Si aucun livre ne correspond, affichez No books found. Les résultats doivent être affichés dans l'ordre où ils apparaissent dans la collection de la bibliothèque.

Par exemple, si les entrées sont :

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

La sortie devrait être :

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

Un autre exemple avec la même configuration de bibliothèque mais en recherchant les livres disponibles :

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

La sortie devrait être :

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

LINQ transforme ce qui serait des boucles complexes en requêtes expressives et lisibles. Des méthodes comme Where() pour le filtrage et ToList() pour matérialiser les résultats rendront votre implémentation de recherche propre et facile à maintenir !

Essayez vous-même

using System;
using System.Collections.Generic;

namespace LibrarySystem
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Lire le nom de la bibliothèque
            string libraryName = Console.ReadLine();
            
            // Créer une instance de Library avec le nom de la bibliothèque
            Library library = new Library(libraryName);
            
            // Lire le nombre de livres
            int numBooks = Convert.ToInt32(Console.ReadLine());
            
            // Lire et ajouter des livres
            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);
            }
            
            // Lire le nombre d'opérations d'emprunt pour configurer l'état initial
            int numBorrows = Convert.ToInt32(Console.ReadLine());
            
            // Traiter les opérations d'emprunt (uniquement les IDs de livres)
            for (int i = 0; i < numBorrows; i++)
            {
                string bookId = Console.ReadLine();
                Book book = library.GetBookById(bookId);
                if (book != null)
                {
                    book.IsAvailable = false;
                }
            }
            
            // Lire la commande de recherche
            string searchCommand = Console.ReadLine();
            
            // Traiter la commande de recherche
            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);
                }
            }
            
            // Afficher les résultats
            if (results.Count == 0)
            {
                Console.WriteLine("No books found");
            }
            else
            {
                foreach (Book book in results)
                {
                    Console.WriteLine($"{book.Title} by {book.Author}");
                }
            }
        }
    }
}

Toutes les leçons de Programmation Orientée Objet