Menu
Coddy logo textTech

Wyszukiwanie za pomocą LINQ

Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 65 z 70.

challenge icon

Wyzwanie

Łatwy

Dodajmy 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ściami Id, Title, Author i IsAvailable, a także metodami Borrow() i Return().
  • User.cs: Zachowaj klasę User z funkcjonalnością śledzenia wypożyczeń, w tym MaxBooks, 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ążki
    • GetBorrowedBooks() — zwraca wszystkie aktualnie wypożyczone książki
    Każda metoda wyszukiwania powinna zwracać kolekcję książek, po której można iterować.
  • 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łu
    • author|name — pobierz książki danego autora
    • available — pobierz wszystkie dostępne książki
    • borrowed — 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|Tolkien

Wynik powinien być następujący:

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

Kolejny 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
available

Wynik powinien być następujący:

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

LINQ 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

Poćwicz samodzielnie: Kompilator C# online