Menu
Coddy logo textTech

LINQ для поиска

Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 65 из 70.

challenge icon

Задание

Легко

Давайте добавим мощные возможности поиска в вашу библиотечную систему с помощью LINQ! Вы реализуете методы, которые позволят пользователям находить книги по различным критериям: поиск по названию, фильтрация по автору и поиск доступных книг. LINQ делает такие запросы элегантными и читаемыми.

Вы продолжите работу над существующей структурой проекта:

  • Book.cs: Сохраните класс Book со свойствами Id, Title, Author и IsAvailable, а также методами Borrow() и Return().
  • User.cs: Сохраните класс User с функциональностью отслеживания заимствований, включая MaxBooks, CanBorrow() и методы для управления взятыми книгами.
  • Library.cs: Здесь вы добавите методы поиска на базе LINQ. В дополнение к существующей логике заимствования, реализуйте следующие возможности поиска:
    • SearchByTitle(string keyword) — возвращает все книги, название которых содержит ключевое слово (без учета регистра)
    • GetBooksByAuthor(string author) — возвращает все книги конкретного автора (точное совпадение, без учета регистра)
    • GetAvailableBooks() — возвращает все книги, которые в данный момент доступны
    • GetBorrowedBooks() — возвращает все книги, которые в данный момент выданы
    Каждый метод поиска должен возвращать коллекцию книг, которую можно перебирать.
  • Program.cs: Обработка поисковых запросов и отображение результатов.

Вы получите следующие входные данные:

  • Название библиотеки
  • Количество книг, затем каждая книга в формате id|title|author
  • Количество операций заимствования для настройки начального состояния, затем каждый bookId
  • Команда поиска в одном из следующих форматов:
    • title|keyword — поиск книг по ключевому слову в названии
    • author|name — поиск книг по автору
    • available — получить все доступные книги
    • borrowed — получить все выданные книги

Для результатов поиска выведите каждую подходящую книгу на отдельной строке в формате {Title} by {Author}. Если подходящих книг не найдено, выведите No books found. Результаты должны выводиться в том порядке, в котором они хранятся в коллекции библиотеки.

Например, если входные данные следующие:

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

Вывод должен быть таким:

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

Другой пример с той же настройкой библиотеки, но поиском доступных книг:

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

Вывод должен быть таким:

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

LINQ превращает сложные циклы в выразительные и читаемые запросы. Методы, такие как Where() для фильтрации и ToList() для материализации результатов, сделают вашу реализацию поиска чистой и удобной в поддержке!

Попробуйте сами

using System;
using System.Collections.Generic;

namespace LibrarySystem
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Чтение названия библиотеки
            string libraryName = Console.ReadLine();
            
            // Создание экземпляра Library с названием библиотеки
            Library library = new Library(libraryName);
            
            // Чтение количества книг
            int numBooks = Convert.ToInt32(Console.ReadLine());
            
            // Чтение и добавление книг
            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);
            }
            
            // Чтение количества операций выдачи для установки начального состояния
            int numBorrows = Convert.ToInt32(Console.ReadLine());
            
            // Обработка операций выдачи (только ID книг)
            for (int i = 0; i < numBorrows; i++)
            {
                string bookId = Console.ReadLine();
                Book book = library.GetBookById(bookId);
                if (book != null)
                {
                    book.IsAvailable = false;
                }
            }
            
            // Чтение команды поиска
            string searchCommand = Console.ReadLine();
            
            // Обработка команды поиска
            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);
                }
            }
            
            // Вывод результатов
            if (results.Count == 0)
            {
                Console.WriteLine("No books found");
            }
            else
            {
                foreach (Book book in results)
                {
                    Console.WriteLine($"{book.Title} by {book.Author}");
                }
            }
        }
    }
}

Все уроки раздела Объектно-ориентированное программирование