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 özellikleri ekleyelim! Kullanıcıların kitapları çeşitli ölçütlere göre bulmasını sağlayan yöntemleri uygulayacaksınız: başlığa göre arama, yazara göre filtreleme ve mevcut kitapları bulma. LINQ, bu sorguları zarif ve okunabilir hâle getirir.

Mevcut proje yapınız üzerine geliştirmeye devam edeceksiniz:

  • Book.cs: Id, Title, Author ve IsAvailable özelliklerine, ayrıca Borrow() ve Return() yöntemlerine sahip Book sınıfınızı koruyun.
  • User.cs: MaxBooks, CanBorrow() ve ödünç alınan kitapları yönetmeye yönelik yöntemler de dâhil olmak üzere, ödünç alma takibi işlevine sahip User sınıfınızı koruyun.
  • Library.cs: LINQ destekli arama yöntemlerinizi buraya ekleyeceksiniz. Mevcut ödünç alma mantığınıza ek olarak şu arama özelliklerini uygulayın:
    • SearchByTitle(string keyword) - başlığı anahtar kelimeyi içeren tüm kitapları döndürür (büyük/küçük harfe 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 harfe 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 yöntemi, üzerinde yineleme yapılabilen 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 biçiminde her kitap
  • Başlangıç durumunu ayarlamak için ödünç alma işlemi sayısı, ardından her işlem için bookId
  • Aşağıdaki biçimlerden birindeki arama komutu:
    • title|keyword - kitaplarda başlık anahtar kelimesine göre arama yapar
    • author|name - yazara göre kitapları getirir
    • available - mevcut tüm kitapları getirir
    • borrowed - ödünç alınmış tüm kitapları getirir

Arama sonuçları için eşleşen her kitabı {Title} by {Author} biçiminde kendi satırına 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 şöyleyse:

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 kurulumu ile mevcut kitaplar aranırken 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ülerle yapılabilecek işlemleri anlamlı ve okunabilir sorgulara dönüştürür. Filtreleme için Where() ve sonuçları somutlaştırmak için ToList() gibi yöntemler, arama uygulamanızı temiz ve sürdürülebilir hâle 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

Kendi başına pratik yap: Online C# derleyicisi