LINQ für die Suche
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 65 von 70.
Aufgabe
EinfachLassen Sie uns Ihrem Bibliothekssystem mit LINQ leistungsstarke Suchfunktionen hinzufügen! Sie werden Methoden implementieren, mit denen Benutzer Bücher nach verschiedenen Kriterien finden können – Suche nach Titel, Filtern nach Autor und Finden verfügbarer Bücher. LINQ macht diese Abfragen elegant und lesbar.
Sie werden auf Ihrer bestehenden Projektstruktur aufbauen:
Book.cs: Behalten Sie Ihre Book-Klasse mit den EigenschaftenId,Title,AuthorundIsAvailablesowie den MethodenBorrow()undReturn()bei.User.cs: Behalten Sie Ihre User-Klasse mit der Funktionalität zur Verfolgung von Ausleihen bei, einschließlichMaxBooks,CanBorrow()und den Methoden zur Verwaltung ausgeliehener Bücher.Library.cs: Hier fügen Sie Ihre LINQ-gestützten Suchmethoden hinzu. Implementieren Sie zusätzlich zu Ihrer bestehenden Ausleihlogik diese Suchfunktionen:SearchByTitle(string keyword)– Gibt alle Bücher zurück, deren Titel das Schlüsselwort enthält (Groß-/Kleinschreibung wird nicht berücksichtigt)GetBooksByAuthor(string author)– Gibt alle Bücher eines bestimmten Autors zurück (genaue Übereinstimmung, Groß-/Kleinschreibung wird nicht berücksichtigt)GetAvailableBooks()– Gibt alle Bücher zurück, die derzeit verfügbar sindGetBorrowedBooks()– Gibt alle Bücher zurück, die derzeit ausgeliehen sind
Program.cs: Verarbeiten Sie Suchanfragen und zeigen Sie die Ergebnisse an.
Sie erhalten die folgenden Eingaben:
- Name der Bibliothek
- Anzahl der Bücher, dann jedes Buch als
id|title|author - Anzahl der Ausleihvorgänge zum Einrichten des Anfangszustands, dann jeweils als
bookId - Ein Suchbefehl in einem dieser Formate:
title|keyword– Suche nach Büchern per Titel-Schlüsselwortauthor|name– Bücher nach Autor abrufenavailable– alle verfügbaren Bücher abrufenborrowed– alle ausgeliehenen Bücher abrufen
Geben Sie für die Suchergebnisse jedes passende Buch in einer eigenen Zeile im Format {Title} by {Author} aus. Wenn keine Bücher übereinstimmen, geben Sie No books found aus. Die Ergebnisse sollten in der Reihenfolge ausgegeben werden, in der sie in der Sammlung der Bibliothek erscheinen.
Wenn die Eingaben beispielsweise wie folgt sind:
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|TolkienDie Ausgabe sollte sein:
The Hobbit by Tolkien
The Lord of the Rings by Tolkien
The Silmarillion by TolkienEin weiteres Beispiel mit demselben Bibliotheksaufbau, aber der Suche nach verfügbaren Büchern:
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
availableDie Ausgabe sollte sein:
The Lord of the Rings by Tolkien
Animal Farm by George Orwell
The Silmarillion by TolkienLINQ verwandelt komplexe Schleifen in ausdrucksstarke, lesbare Abfragen. Methoden wie Where() zum Filtern und ToList() zum Materialisieren von Ergebnissen machen Ihre Suchimplementierung sauber und wartbar!
Probier es selbst
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Bibliotheksnamen lesen
string libraryName = Console.ReadLine();
// Eine Library-Instanz mit dem Bibliotheksnamen erstellen
Library library = new Library(libraryName);
// Anzahl der Bücher lesen
int numBooks = Convert.ToInt32(Console.ReadLine());
// Bücher lesen und hinzufügen
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);
}
// Anzahl der Ausleihvorgänge lesen, um den Anfangszustand festzulegen
int numBorrows = Convert.ToInt32(Console.ReadLine());
// Ausleihvorgänge verarbeiten (nur Buch-IDs)
for (int i = 0; i < numBorrows; i++)
{
string bookId = Console.ReadLine();
Book book = library.GetBookById(bookId);
if (book != null)
{
book.IsAvailable = false;
}
}
// Suchbefehl lesen
string searchCommand = Console.ReadLine();
// Suchbefehl verarbeiten
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);
}
}
// Ergebnisse ausgeben
if (results.Count == 0)
{
Console.WriteLine("No books found");
}
else
{
foreach (Book book in results)
{
Console.WriteLine($"{book.Title} by {book.Author}");
}
}
}
}
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienNamespaces & DirektivenEinführung in Klassen & ObjekteDas 'this'-SchlüsselwortMethoden und ParameterFelder vs. EigenschaftenKonstruktorenObjekt-InitialisiererZusammenfassung - Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (:) SyntaxDas 'base'-SchlüsselwortVirtual & Override SchlüsselwörterVersiegelte KlassenDie 'object'-BasisklasseZusammenfassung – Mitarbeiter-Hierarchie7Fortgeschrittene Funktionen
OperatorüberladungIndexer (this[])ToString() überschreibenErweiterungsmethodenZusammenfassung - Benutzerdefinierte Liste2Eigenschaften & Statische Member
Automatisch implementierte EigenschaftenRead-Only- & Write-Only-EigenschaftenStatische Felder & MethodenStatische KlassenExpression-Bodied Member5Polymorphismus & Interfaces
Compile- vs. Runtime-PolymorphismusInterface vs. abstrakte KlasseMehrfache InterfacesExplizite InterfacesUpcasting & DowncastingRecap – Shape Calculator3Klassenarchitektur
Instanz- vs. statische Daten'readonly' & 'const' SchlüsselwörterBacking FieldsZusammenfassung - Bankkonto-Manager6Kapselung
ZugriffsmodifikatorenProperties zur KapselungImplementierung von Data HidingImmutability-MusterRückblick – Studierendendaten9Variable Argumente
Das 'params'-SchlüsselwortOptionale ParameterBenannte ArgumenteMethodenüberladung12Projekt: Bibliothekssystem
ProjektstrukturBuch- und Benutzermodelle