חיפוש באמצעות 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());
// עבד את פעולות ההשאלה (מזהי ספרים בלבד)
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מחלקות Sealedמחלקת הבסיס 'object'סיכום – היררכיית עובדים7תכונות מתקדמות
העמסת אופרטוריםאינדקסרים (this[])דריסת ToString()מתודות הרחבהסיכום – רשימה מותאמת אישית2מאפיינים וחברים סטטיים
מאפיינים במימוש אוטומטימאפיינים לקריאה בלבד ולכתיבה בלבדשדות ומתודות סטטייםמחלקות סטטיותחברים עם גוף ביטוי5פולימורפיזם וממשקים
פולימורפיזם בזמן קומפילציה לעומת בזמן ריצהממשק לעומת מחלקה מופשטתממשקים מרוביםממשקים מפורשיםהמרה כלפי מעלה והמרה כלפי מטהחזרה: מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה במקום ירושהGenerics (מחלקות ומתודות)נציגים ואירועיםמאפיינים ורפלקציהIDisposable והצהרת usingיסודות הזרקת תלויות3ארכיטקטורת מחלקות
נתוני מופע לעומת נתונים סטטייםמילות המפתח 'readonly' ו-'const'שדות גיבויסיכום – מנהל חשבונות בנק12פרויקט: מערכת ספרייה
מבנה הפרויקטמודלים של ספרים ומשתמשיםלוגיקת השאלת ספריםחיפוש באמצעות LINQממשק משתמש בקונסולה / ממשק מנהלבדיקות יחידה (NUnit/xUnit)תרגלו בעצמכם: קומפיילר C# אונליין