Arama ve filtreleme
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
-
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
-
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.
-
Sonuç listesine ekleme
result.____(b);Cevabı göster
result.Add(b);