LINQ để tìm kiếm
Thuộc phần Lập trình hướng đối tượng trong hành trình C# của Coddy. Bài học 65 trên 70.
Thử thách
DễHãy thêm khả năng tìm kiếm mạnh mẽ bằng LINQ vào hệ thống thư viện của bạn! Bạn sẽ triển khai các phương thức cho phép người dùng tìm sách theo nhiều tiêu chí, như tìm theo tiêu đề, lọc theo tác giả và tìm sách có thể cho mượn. LINQ giúp các truy vấn này trở nên rõ ràng và dễ đọc.
Bạn sẽ tiếp tục xây dựng dựa trên cấu trúc dự án hiện có:
Book.cs: Giữ nguyên lớp Book với các thuộc tínhId,Title,AuthorvàIsAvailable, cùng các phương thứcBorrow()vàReturn().User.cs: Giữ nguyên lớp User với chức năng theo dõi việc mượn sách, bao gồmMaxBooks,CanBorrow()và các phương thức quản lý sách đã mượn.Library.cs: Đây là nơi bạn sẽ thêm các phương thức tìm kiếm bằng LINQ. Ngoài logic mượn sách hiện có, hãy triển khai các chức năng tìm kiếm sau:SearchByTitle(string keyword)- Trả về tất cả sách có tiêu đề chứa từ khóa (không phân biệt chữ hoa chữ thường)GetBooksByAuthor(string author)- Trả về tất cả sách của một tác giả cụ thể (khớp chính xác, không phân biệt chữ hoa chữ thường)GetAvailableBooks()- Trả về tất cả sách hiện có thể cho mượnGetBorrowedBooks()- Trả về tất cả sách hiện đang được mượn
Program.cs: Xử lý các truy vấn tìm kiếm và hiển thị kết quả.
Bạn sẽ nhận các đầu vào sau:
- Tên thư viện
- Số lượng sách, sau đó là từng cuốn sách theo định dạng
id|title|author - Số lượt mượn sách để thiết lập trạng thái ban đầu, sau đó là từng mã theo định dạng
bookId - Một lệnh tìm kiếm theo một trong các định dạng sau:
title|keyword- tìm sách theo từ khóa trong tiêu đềauthor|name- tìm sách theo tác giảavailable- tìm tất cả sách có thể cho mượnborrowed- tìm tất cả sách đang được mượn
Với kết quả tìm kiếm, hãy in mỗi cuốn sách khớp trên một dòng theo định dạng {Title} by {Author}. Nếu không có sách nào khớp, hãy in No books found. Kết quả cần được in theo thứ tự sách xuất hiện trong bộ sưu tập của thư viện.
Ví dụ, nếu đầu vào là:
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Đầu ra sẽ là:
The Hobbit by Tolkien
The Lord of the Rings by Tolkien
The Silmarillion by TolkienVí dụ khác với cùng thiết lập thư viện nhưng tìm sách có thể cho mượn:
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Đầu ra sẽ là:
The Lord of the Rings by Tolkien
Animal Farm by George Orwell
The Silmarillion by TolkienLINQ biến những vòng lặp phức tạp thành các truy vấn rõ ràng, dễ đọc. Các phương thức như Where() để lọc và ToList() để chuyển kết quả thành danh sách sẽ giúp phần triển khai chức năng tìm kiếm của bạn gọn gàng và dễ bảo trì!
Tự làm thử
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Đọc tên thư viện
string libraryName = Console.ReadLine();
// Tạo một instance của Library với tên thư viện
Library library = new Library(libraryName);
// Đọc số lượng sách
int numBooks = Convert.ToInt32(Console.ReadLine());
// Đọc và thêm sách
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);
}
// Đọc số lần mượn sách để thiết lập trạng thái ban đầu
int numBorrows = Convert.ToInt32(Console.ReadLine());
// Xử lý các lần mượn sách (chỉ dùng ID sách)
for (int i = 0; i < numBorrows; i++)
{
string bookId = Console.ReadLine();
Book book = library.GetBookById(bookId);
if (book != null)
{
book.IsAvailable = false;
}
}
// Đọc lệnh tìm kiếm
string searchCommand = Console.ReadLine();
// Xử lý lệnh tìm kiếm
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);
}
}
// In ra kết quả
if (results.Count == 0)
{
Console.WriteLine("No books found");
}
else
{
foreach (Book book in results)
{
Console.WriteLine($"{book.Title} by {book.Author}");
}
}
}
}
}
Tất cả bài học trong Lập trình hướng đối tượng
1Các khái niệm cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiKhông gian tên và chỉ thịGiới thiệu về lớp và đối tượngTừ khóa thisPhương thức và tham sốTrường và thuộc tínhHàm khởi tạoKhởi tạo đối tượngÔn tập: Máy tính đơn giản4Kế thừa
Cú pháp kế thừa cơ bản (:)Từ khóa 'base'Từ khóa virtual và overrideLớp sealedLớp cơ sở 'object'Ôn tập: hệ phân cấp nhân viên7Tính năng nâng cao
Nạp chồng toán tửBộ lập chỉ mục (this[])Ghi đè ToString()Phương thức mở rộngÔn tập: Danh sách tùy chỉnh10Các mẫu thiết kế phần 1
Giới thiệu về mẫu thiết kếSingleton an toàn với luồngMẫu FactoryMẫu Observer (sự kiện)Mẫu Strategy2Thuộc tính và thành viên tĩnh
Thuộc tính tự độngThuộc tính chỉ đọc hoặc chỉ ghiTrường và phương thức tĩnhLớp tĩnhThành viên có thân biểu thức5Đa hình và interface
Đa hình lúc biên dịch và lúc chạyInterface và lớp trừu tượngNhiều interfaceInterface tường minhUpcasting và downcastingÔn tập: bộ tính toán hình học8Các khái niệm OOP nâng cao
Ưu tiên composition hơn kế thừaGenerics (lớp và phương thức)Delegate và sự kiệnAttribute và reflectionGiao diện IDisposable và câu lệnh usingKiến thức cơ bản về dependency injection11Các mẫu thiết kế phần 2
Mẫu lệnhMẫu bộ chuyển đổiMẫu trang tríMẫu phương thức khuôn mẫuMẫu trạng tháiMẫu tổ hợp3Kiến trúc lớp
Dữ liệu instance và dữ liệu tĩnhTừ khóa 'readonly' và 'const'Trường lưu trữÔn tập: Trình quản lý tài khoản ngân hàng6Đóng gói
Bộ điều chỉnh quyền truy cậpThuộc tính để đóng góiTriển khai ẩn dữ liệuCác mẫu bất biếnÔn tập: hồ sơ học sinh12Dự án: hệ thống thư viện
Cấu trúc dự ánMô hình sách và người dùngLogic hệ thống mượn sáchLINQ để tìm kiếmGiao diện console / giao diện quản trịKiểm thử đơn vị (NUnit/xUnit)Tự luyện tập: Trình biên dịch C# online