LINQ للبحث
جزء من قسم Object Oriented Programming في رحلة 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 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());
// معالجة عمليات الاستعارة (معرفات الكتب فقط)
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}");
}
}
}
}
}
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةNamespaces والتوجيهاتمقدمة في Classes و Objectsالكلمة المفتاحية 'this'Methods والمعاملاتFields مقابل PropertiesConstructorsObject Initializersمراجعة - آلة حاسبة بسيطة4الوراثة
صيغة الوراثة الأساسية (:)الكلمة المفتاحية 'base'الكلمات المفتاحية Virtual و Overrideالأصناف المختومة (Sealed Classes)الفئة الأساسية 'object'مراجعة - هيكلية الموظفين7ميزات متقدمة
تحميل العوامل (Operator Overloading)المفهرسات (Indexers (this[]))إعادة تعريف ()ToStringدوال التوسعة (Extension Methods)ملخص - Custom List2الخصائص والأعضاء الساكنة (Static Members)
الخصائص المطبقة تلقائيًا (Auto-Implemented Properties)خصائص القراءة فقط والكتابة فقطالحقول والدوال الساكنة (Static)الفئات الساكنة (Static Classes)الأعضاء ذات البنية التعبيرية (Expression-Bodied Members)5تعدد الأشكال والواجهات (Polymorphism & Interfaces)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالواجهة مقابل الفئة المجردة (Abstract Class)الواجهات المتعددةالواجهات الصريحةUpcasting و Downcastingملخص - حاسبة الأشكال8مفاهيم البرمجة كائنية التوجه (OOP) المتقدمة
التركيب بدلاً من الوراثةالـ Generics (الأصناف والدوال)الـ Delegates والأحداثالـ Attributes والـ Reflectionواجهة IDisposable وجملة usingأساسيات Dependency Injection3بنية الكلاسات
بيانات الـ Instance مقابل البيانات الـ Staticالكلمات المفتاحية 'readonly' و 'const'الحقول الخلفية (Backing Fields)مراجعة - مدير الحساب البنكي6التغليف
معدلات الوصولالخصائص من أجل التغليفتنفيذ إخفاء البياناتأنماط عدم القابلية للتغييرمراجعة - سجلات الطلاب12مشروع: نظام المكتبة
هيكلة المشروعنماذج الكتاب والمستخدم