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());
            
            // עבד את פעולות ההשאלה (מזהי ספרים בלבד)
            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}");
                }
            }
        }
    }
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C# אונליין