Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

LINQ للبحث

جزء من قسم Object Oriented Programming في رحلة 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());
            
            // معالجة عمليات الاستعارة (معرفات الكتب فقط)
            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