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 fonctionnalités de recherche à votre système de bibliothèque avec LINQ ! Vous allez implémenter des méthodes permettant aux utilisateurs de trouver des livres selon différents critères : recherche par titre, filtrage par auteur et recherche de livres disponibles. LINQ rend ces requêtes élégantes et lisibles.
Vous allez continuer à construire sur la structure existante de votre projet :
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, notammentMaxBooks,CanBorrow()et les méthodes de gestion des livres empruntés.Library.cs: c'est ici que vous allez ajouter vos méthodes de recherche utilisant LINQ. En plus de votre logique d'emprunt existante, implémentez ces fonctionnalités de recherche :SearchByTitle(string keyword)- renvoie tous les livres dont le titre contient le mot-clé (sans tenir compte de la casse)GetBooksByAuthor(string author)- renvoie tous les livres d'un auteur donné (correspondance exacte, sans tenir compte de la casse)GetAvailableBooks()- renvoie tous les livres actuellement disponiblesGetBorrowedBooks()- renvoie tous les livres actuellement empruntés
Program.cs: traitez les requêtes de recherche et affichez les résultats.
Vous recevrez les entrées suivantes :
- Nom de la bibliothèque
- Nombre de livres, puis chaque livre au format
id|title|author - Nombre d'opérations d'emprunt pour configurer l'état initial, puis chacune sous la forme
bookId - Une commande de recherche dans l'un des formats suivants :
title|keyword- rechercher des livres par mot-clé dans le titreauthor|name- obtenir les livres d'un 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 dans lequel les livres 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 doit être :
The Hobbit by Tolkien
The Lord of the Rings by Tolkien
The Silmarillion by TolkienAutre 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 doit être :
The Lord of the Rings by Tolkien
Animal Farm by George Orwell
The Silmarillion by TolkienLINQ transforme des boucles qui seraient 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 claire 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 UtilisateurLogique du système d'empruntLINQ pour la rechercheInterface Console / Interface d'administrationTests unitaires (NUnit/xUnit)Entraînez-vous par vous-même : Compilateur C# en ligne