Menu
Coddy logo textTech

Arama için LINQ

Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 65 / 70.

challenge icon

Görev

Kolay

LINQ kullanarak Kütüphane Sisteminize güçlü arama yetenekleri ekleyelim! Kullanıcıların çeşitli kriterlere göre kitap bulmasını sağlayan yöntemler uygulayacaksınız - başlığa göre arama, yazara göre filtreleme ve mevcut kitapları bulma. LINQ, bu sorguları zarif ve okunabilir hale getirir.

Mevcut proje yapınızın üzerine inşa etmeye devam edeceksiniz:

  • Book.cs: Id, Title, Author ve IsAvailable özelliklerinin yanı sıra Borrow() ve Return() metotlarını içeren Book sınıfınızı koruyun.
  • User.cs: MaxBooks, CanBorrow() ve ödünç alınan kitapları yönetme metotları dahil olmak üzere ödünç alma takip işlevine sahip User sınıfınızı koruyun.
  • Library.cs: LINQ destekli arama metotlarınızı buraya ekleyeceksiniz. Mevcut ödünç alma mantığınıza ek olarak, şu arama yeteneklerini uygulayın:
    • SearchByTitle(string keyword) - Başlığı anahtar kelimeyi içeren tüm kitapları döndürür (büyük/küçük harf duyarsız)
    • GetBooksByAuthor(string author) - Belirli bir yazara ait tüm kitapları döndürür (tam eşleşme, büyük/küçük harf duyarsız)
    • GetAvailableBooks() - Şu anda mevcut olan tüm kitapları döndürür
    • GetBorrowedBooks() - Şu anda ödünç alınmış olan tüm kitapları döndürür
    Her arama metodu, üzerinde dönülebilecek (iterate) bir kitap koleksiyonu döndürmelidir.
  • Program.cs: Arama sorgularını işleyin ve sonuçları görüntüleyin.

Aşağıdaki girdileri alacaksınız:

  • Kütüphane adı
  • Kitap sayısı, ardından id|title|author formatında her bir kitap
  • Başlangıç durumunu ayarlamak için ödünç alma işlemi sayısı, ardından her biri bookId olarak
  • Şu formatlardan birinde bir arama komutu:
    • title|keyword - kitapları başlık anahtar kelimesine göre ara
    • author|name - kitapları yazara göre getir
    • available - tüm mevcut kitapları getir
    • borrowed - tüm ödünç alınmış kitapları getir

Arama sonuçları için, eşleşen her kitabı kendi satırında {Title} by {Author} formatında yazdırın. Hiçbir kitap eşleşmezse, No books found yazdırın. Sonuçlar, kütüphane koleksiyonunda göründükleri sırayla yazdırılmalıdır.

Örneğin, girdiler şunlarsa:

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

Çıktı şöyle olmalıdır:

The Hobbit by Tolkien
The Lord of the Rings by Tolkien
The Silmarillion by Tolkien

Aynı kütüphane kurulumuyla ancak mevcut kitapları arayan başka bir örnek:

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

Çıktı şöyle olmalıdır:

The Lord of the Rings by Tolkien
Animal Farm by George Orwell
The Silmarillion by Tolkien

LINQ, karmaşık döngüleri anlamlı ve okunabilir sorgulara dönüştürür. Filtreleme için Where() ve sonuçları somutlaştırmak için ToList() gibi metotlar, arama uygulamanızı temiz ve bakımı kolay hale getirecektir!

Kendin dene

using System;
using System.Collections.Generic;

namespace LibrarySystem
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Kütüphane adını oku
            string libraryName = Console.ReadLine();
            
            // Kütüphane adıyla bir Library örneği oluştur
            Library library = new Library(libraryName);
            
            // Kitap sayısını oku
            int numBooks = Convert.ToInt32(Console.ReadLine());
            
            // Kitapları oku ve ekle
            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);
            }
            
            // Başlangıç durumunu ayarlamak için ödünç alma işlemi sayısını oku
            int numBorrows = Convert.ToInt32(Console.ReadLine());
            
            // Ödünç alma işlemlerini işle (sadece kitap ID'leri)
            for (int i = 0; i < numBorrows; i++)
            {
                string bookId = Console.ReadLine();
                Book book = library.GetBookById(bookId);
                if (book != null)
                {
                    book.IsAvailable = false;
                }
            }
            
            // Arama komutunu oku
            string searchCommand = Console.ReadLine();
            
            // Arama komutunu işle
            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);
                }
            }
            
            // Sonuçları yazdır
            if (results.Count == 0)
            {
                Console.WriteLine("No books found");
            }
            else
            {
                foreach (Book book in results)
                {
                    Console.WriteLine($"{book.Title} by {book.Author}");
                }
            }
        }
    }
}

Nesne Yönelimli Programlama bölümündeki tüm dersler