CodeBlanks Logo Icon CodeBlanks

Arama ve filtreleme

C# kursu · Orta seviye · Ders 68/116

LINQ ile kitap arama ve filtreleme yazarsın.

Yazara göre arama

Bu derste Library sınıfına SearchByAuthor metodunu ekleyeceğiz. Bu metod, bir yazar adı alır ve o yazara ait kitapların listesini döndürür. İçeride foreach ile tüm kitapları dolaşıp her birinin Author özelliğini karşılaştırırız.

Sonuçları yeni bir List<Book> içinde toplarız. Eşleşen her kitabı bu listeye Add ile ekleriz. Metod sonunda bu listeyi döndürürüz. Bu desen, LINQ'nin Where metodunun arka planda yaptığı işin sade bir versiyonudur; elle yazmak mantığı anlamanı sağlar.

Sonuç listesi biriktirmek

Arama metotlarında genel desen şudur: önce boş bir sonuç listesi üretirsin, sonra foreach ile kaynak koleksiyonu dolaşıp koşula uyanları bu listeye eklersin. var result = new List<Book>(); ile başlarsın.

Bu desene filter (süzme) denir. Koşul if (b.Author == author) gibi bir eşitlik kontrolüdür; daha karmaşık koşullar da yazabilirsin (örneğin Contains ile kısmi eşleşme). Sonuç listesi boş kalabilir; bu, aramanın hiç kitap bulamadığı anlamına gelir.

Uygulama SearchByAuthor metodunu ekle

Library sınıfına public List<Book> SearchByAuthor(string author) metodunu ekle. Gövdede var result = new List<Book>(); ile başla; foreach (var b in _books) ile dolaş; if (b.Author == author) result.Add(b); yap; son olarak return result; ile dön. Main içinde yeni bir kitap ekle (Oğuz Atay'dan) ve foreach ile lib.SearchByAuthor("Oğuz Atay") sonuçlarını yazdır.

Örnek çözümü göster
Library içine public List<Book> SearchByAuthor(string author) { var result = new List<Book>(); foreach (var b in _books) { if (b.Author == author) result.Add(b); } return result; } ekle. Main'de lib.AddBook(new Book { Title="Aylak Adam", Author="Oğuz Atay" }); ekle ve foreach (var b in lib.SearchByAuthor("Oğuz Atay")) Console.WriteLine(b.Title); yaz.
Örnek çözüm:
using System;
using System.Collections.Generic;

class Book
{
    public string Title { get; set; }
    public string Author { get; set; }
    public bool IsBorrowed { get; set; }
}

class Member
{
    public string Name { get; set; }
    public int BorrowedCount { get; set; }
}

class Library
{
    private List<Book> _books = new List<Book>();
    private List<Member> _members = new List<Member>();

    public void AddBook(Book b) { _books.Add(b); }
    public void AddMember(Member m) { _members.Add(m); }

    public void ListBooks()
    {
        foreach (var b in _books)
        {
            Console.WriteLine(b.Title);
        }
    }

    public void Checkout(Member m, Book b)
    {
        if (!b.IsBorrowed)
        {
            b.IsBorrowed = true;
            m.BorrowedCount++;
        }
    }

    public void Return(Member m, Book b)
    {
        if (b.IsBorrowed)
        {
            b.IsBorrowed = false;
            m.BorrowedCount--;
        }
    }

    public List<Book> SearchByAuthor(string author)
    {
        var result = new List<Book>();
        foreach (var b in _books)
        {
            if (b.Author == author) result.Add(b);
        }
        return result;
    }
}

class Program
{
    static void Main()
    {
        var book = new Book { Title = "Çalıkuşu", Author = "Reşat Nuri" };
        var member = new Member { Name = "Ayşe" };
        Console.WriteLine(book.Title);
        Console.WriteLine(member.Name);
        var lib = new Library();
        lib.AddBook(new Book { Title = "Tutunamayanlar", Author = "Oğuz Atay" });
        lib.AddBook(new Book { Title = "Aylak Adam", Author = "Oğuz Atay" });
        lib.ListBooks();
        lib.AddMember(member);
        lib.Checkout(member, book);
        Console.WriteLine(book.IsBorrowed);
        foreach (var b in lib.SearchByAuthor("Oğuz Atay"))
        {
            Console.WriteLine(b.Title);
        }
    }
}

Kendini test et

  1. Arama parçasını görevine eşle

    foreach
    Her kitabı dolaşır
    if
    Karşılaştırma yapar
    result.Add
    Eşleşeni toplar
    return result
    Listeyi döndürür
  2. Hangisi arama için doğru koşuldur?

    foreach (var b in _books) {
        if (______) result.Add(b);
    }
    • b.Title = author
    • b.Author != author
    • b.IsBorrowed
    • b.Author == author
    Cevabı göster

    b.Author == author — Doğru. Yazar eşitliğini == ile kontrol ederiz.

  3. Sonuç listesine ekleme

    result.____(b);
    Cevabı göster
    result.Add(b);

Orta seviye bölümündeki tüm dersler