LINQ для поиска
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 65 из 70.
Задание
ЛегкоДавайте добавим мощные возможности поиска в вашу библиотечную систему с помощью 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 TolkienLINQ превращает сложные циклы в выразительные и читаемые запросы. Методы, такие как 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}");
}
}
}
}
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыПространства имен и директивыВведение в классы и объектыКлючевое слово 'this'Методы и параметрыПоля и свойстваКонструкторыИнициализаторы объектовИтоги — Простой калькулятор4Наследование
Основы синтаксиса наследования (:)Ключевое слово 'base'Ключевые слова Virtual и OverrideЗапечатанные классыБазовый класс 'object'Итоги — Иерархия сотрудников7Продвинутые возможности
Перегрузка операторовИндексаторы (this[])Переопределение ToString()Методы расширенияПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПотокобезопасный SingletonПаттерн FactoryПаттерн Observer (События)Паттерн Strategy13Финальные испытания
Платформа для онлайн-обученияКомпонент игрового персонажаСервис аренды транспорта2Свойства и статические члены
Автоматически реализуемые свойстваСвойства только для чтения и записиСтатические поля и методыСтатические классыЧлены в виде выражений5Полиморфизм и интерфейсы
Полиморфизм: компиляция vs выполнениеИнтерфейс vs абстрактный классМножественные интерфейсыЯвные интерфейсыUpcasting и DowncastingИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция вместо наследованияGenerics (классы и методы)Делегаты и событияАтрибуты и рефлексияIDisposable и оператор usingОсновы Dependency Injection11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Архитектура классов
Экземплярные и статические данныеКлючевые слова 'readonly' и 'const'Опорные поляПовторение — Менеджер банковских счетов6Инкапсуляция
Модификаторы доступаСвойства для инкапсуляцииРеализация скрытия данныхПаттерны неизменяемостиИтоги — Записи студентов9Переменное количество аргументов
Ключевое слово 'params'Необязательные параметрыИменованные аргументыПерегрузка методов12Проект: Система библиотеки
Структура проектаМодели книг и пользователей