Wyszukiwanie za pomocą LINQ
Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 65 z 70.
Wyzwanie
ŁatwyDodajmy zaawansowane możliwości wyszukiwania do twojego systemu bibliotecznego za pomocą LINQ! Zaimplementujesz metody, które pozwolą użytkownikom znajdować książki według różnych kryteriów — wyszukiwać po tytule, filtrować po autorze i znajdować dostępne książki. LINQ sprawia, że te zapytania są eleganckie i czytelne.
Będziesz dalej rozwijać istniejącą strukturę projektu:
Book.cs: Zachowaj klasę Book z właściwościamiId,Title,AuthoriIsAvailable, a także metodamiBorrow()iReturn().User.cs: Zachowaj klasę User z funkcjonalnością śledzenia wypożyczeń, w tymMaxBooks,CanBorrow()i metodami zarządzania wypożyczonymi książkami.Library.cs: To tutaj dodasz metody wyszukiwania wykorzystujące LINQ. Oprócz istniejącej logiki wypożyczania zaimplementuj następujące możliwości wyszukiwania:SearchByTitle(string keyword)— zwraca wszystkie książki, których tytuł zawiera słowo kluczowe (bez rozróżniania wielkości liter)GetBooksByAuthor(string author)— zwraca wszystkie książki konkretnego autora (dokładne dopasowanie, bez rozróżniania wielkości liter)GetAvailableBooks()— zwraca wszystkie aktualnie dostępne książkiGetBorrowedBooks()— zwraca wszystkie aktualnie wypożyczone książki
Program.cs: Przetwarzaj zapytania wyszukiwania i wyświetlaj wyniki.
Otrzymasz następujące dane wejściowe:
- Nazwa biblioteki
- Liczba książek, a następnie każda książka w formacie
id|title|author - Liczba operacji wypożyczenia potrzebnych do ustalenia stanu początkowego, a następnie każda operacja jako
bookId - Polecenie wyszukiwania w jednym z następujących formatów:
title|keyword— wyszukaj książki według słowa kluczowego z tytułuauthor|name— pobierz książki danego autoraavailable— pobierz wszystkie dostępne książkiborrowed— pobierz wszystkie wypożyczone książki
Wyniki wyszukiwania wypisz w osobnych wierszach, po jednej pasującej książce w formacie {Title} by {Author}. Jeśli nie pasuje żadna książka, wypisz No books found. Wyniki powinny być wypisywane w kolejności, w jakiej książki występują w kolekcji biblioteki.
Na przykład, jeśli dane wejściowe to:
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|TolkienWynik powinien być następujący:
The Hobbit by Tolkien
The Lord of the Rings by Tolkien
The Silmarillion by TolkienKolejny przykład z tą samą konfiguracją biblioteki, ale z wyszukiwaniem dostępnych książek:
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
availableWynik powinien być następujący:
The Lord of the Rings by Tolkien
Animal Farm by George Orwell
The Silmarillion by TolkienLINQ przekształca złożone pętle w wyraziste, czytelne zapytania. Metody takie jak Where() do filtrowania i ToList() do materializowania wyników pozwolą ci stworzyć przejrzystą i łatwą w utrzymaniu implementację wyszukiwania!
Spróbuj swoich sił
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Wczytaj nazwę biblioteki
string libraryName = Console.ReadLine();
// Utwórz instancję Library z nazwą biblioteki
Library library = new Library(libraryName);
// Wczytaj liczbę książek
int numBooks = Convert.ToInt32(Console.ReadLine());
// Wczytaj i dodaj książki
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);
}
// Wczytaj liczbę operacji wypożyczenia, aby ustawić stan początkowy
int numBorrows = Convert.ToInt32(Console.ReadLine());
// Przetwórz operacje wypożyczenia (tylko identyfikatory książek)
for (int i = 0; i < numBorrows; i++)
{
string bookId = Console.ReadLine();
Book book = library.GetBookById(bookId);
if (book != null)
{
book.IsAvailable = false;
}
}
// Wczytaj polecenie wyszukiwania
string searchCommand = Console.ReadLine();
// Przetwórz polecenie wyszukiwania
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);
}
}
// Wyświetl wyniki
if (results.Count == 0)
{
Console.WriteLine("No books found");
}
else
{
foreach (Book book in results)
{
Console.WriteLine($"{book.Title} by {book.Author}");
}
}
}
}
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrznePrzestrzenie nazw i dyrektywyWprowadzenie do klas i obiektówSłowo kluczowe „this”Metody i parametryPola a właściwościKonstruktoryInicjalizatory obiektówPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawowa składnia dziedziczenia (:)Słowo kluczowe 'base'Słowa kluczowe virtual i overrideKlasy sealedBazowa klasa 'object'Powtórzenie – hierarchia pracowników7Zaawansowane funkcje
Przeciążanie operatorówIndeksery (this[])Nadpisywanie ToString()Metody rozszerzającePodsumowanie – własna lista2Właściwości i składowe statyczne
Właściwości automatyczneWłaściwości tylko do odczytu i zapisuPola i metody statyczneKlasy statyczneSkładowe z ciałem wyrażeniowym5Polimorfizm i interfejsy
Polimorfizm czasu kompilacji a czasu wykonaniaInterfejs a klasa abstrakcyjnaWiele interfejsówJawne implementowanie interfejsówRzutowanie w górę i w dółPowtórka — kalkulator kształtów8Zaawansowane koncepcje OOP
Kompozycja zamiast dziedziczeniaTypy generyczne (klasy i metody)Delegaty i zdarzeniaAtrybuty i refleksjaIDisposable i instrukcja usingPodstawy wstrzykiwania zależności11Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu3Architektura klas
Dane instancji a dane statyczneSłowa kluczowe 'readonly' i 'const'Pola zapasowePowtórzenie — menedżer kont bankowych6Hermetyzacja
Modyfikatory dostępuWłaściwości w hermetyzacjiImplementacja ukrywania danychWzorce niezmiennościPowtórka — dane studentów9Argumenty zmiennej liczby
Słowo kluczowe „params”Parametry opcjonalneArgumenty nazwanePrzeciążanie metod12Projekt: System biblioteczny
Struktura projektuModele książki i użytkownikaLogika systemu wypożyczeńWyszukiwanie za pomocą LINQInterfejs konsolowy / interfejs administratoraTesty jednostkowe (NUnit/xUnit)Poćwicz samodzielnie: Kompilator C# online