LINQ pour la recherche
Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy — leçon 65 sur 70.
Défi
FacileAjoutons 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ésId,Title,AuthoretIsAvailable, ainsi que les méthodesBorrow()etReturn().User.cs: Conservez votre classe User avec la fonctionnalité de suivi des emprunts, incluantMaxBooks,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 disponiblesGetBorrowedBooks()- Retourne tous les livres qui sont actuellement empruntés
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 titreauthor|name- obtenir les livres par auteuravailable- obtenir tous les livres disponiblesborrowed- 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|TolkienLa sortie devrait être :
The Hobbit by Tolkien
The Lord of the Rings by Tolkien
The Silmarillion by TolkienUn 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
availableLa sortie devrait être :
The Lord of the Rings by Tolkien
Animal Farm by George Orwell
The Silmarillion by TolkienLINQ 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
1Fondamentaux de la POO
Fichiers externesEspaces de noms et directivesIntro aux classes et objetsLe mot-clé 'this'Méthodes et paramètresChamps vs PropriétésConstructeursInitialiseurs d'objetsRécapitulatif - Calculatrice simple4Héritage
Syntaxe de base de l'héritage (:)Le mot-clé 'base'Mots-clés Virtual & OverrideClasses scelléesLa classe de base 'object'Récapitulatif - Hiérarchie des employés7Fonctionnalités avancées
Surcharge d'opérateursIndexeurs (this[])Redéfinition de ToString()Méthodes d'extensionRécapitulatif - Liste personnalisée10Patrons de conception - Partie 1
Introduction aux patrons de conceptionSingleton Thread-SafePatron FabriquePatron Observateur (Événements)Patron Stratégie2Propriétés et membres statiques
Propriétés auto-implémentéesPropriétés en lecture/écriture seuleChamps et méthodes statiquesClasses statiquesMembres à corps d'expression5Polymorphisme & Interfaces
Polymorphisme : Compilation vs ExécutionInterface vs Classe AbstraiteInterfaces MultiplesInterfaces ExplicitesUpcasting & DowncastingRécapitulatif - Calculateur de Formes8Concepts avancés de la POO
Composition plutôt qu'héritageGénériques (Classes et Méthodes)Délégués et ÉvénementsAttributs et RéflexionIDisposable et l'instruction usingBases de l'Injection de Dépendances11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Architecture des classes
Données d'instance vs statiquesMots-clés 'readonly' & 'const'Champs de supportRécapitulatif - Gestionnaire de compte bancaire6Encapsulation
Modificateurs d'accèsPropriétés pour l'encapsulationImplémentation du masquage de donnéesPatterns d'immuabilitéRécapitulatif - Dossiers d'étudiants12Projet : Système de gestion de bibliothèque
Structure du projetModèles Livre et Utilisateur