This content originally appeared on DEV Community and was authored by Mustafa Çam
IEnumerable, C# ve .NET Core’da koleksiyonlar üzerinde işlem yapmak için sıklıkla kullanılan bir arayüzdür (interface). Bu arayüz, bir veri kaynağının üzerinde yineleme (iteration) yapabilmeyi sağlar. IEnumerable, veri yapısına ya da koleksiyonun nasıl oluşturulduğuna bakılmaksızın, tek tek veri öğelerine erişme yeteneği sunar. Bu, temel olarak koleksiyonlar üzerinde dolaşmak ve verilerle işlem yapmak için kullanılan en yaygın arabirimlerden biridir.
IEnumerable Nedir?
-
IEnumerable, temel olarak bir veri koleksiyonunda ardışık veri öğelerine sadece ileriye doğru erişim sağlar. - Bu arayüz, veri koleksiyonlarını temsil eden sınıflarda kullanılan bir kontrattır. Yani,
IEnumerablearayüzünü uygulayan her sınıf,foreachdöngüsü gibi yapıların kullanılmasını sağlar. - Koleksiyon türüne bağlı olarak,
IEnumerablekoleksiyonun tüm verilerini bellekte tutmak zorunda değildir. Bu da özellikle lazy evaluation (ertelemeli değerlendirme) gibi tekniklerle performans avantajı sağlar.
Generic ve Non-generic Versiyonları
C#’ta IEnumerable iki temel versiyonla gelir:
-
IEnumerable(non-generic): Koleksiyonun elemanlarının türünü belirtmez. -
IEnumerable<T>(generic): Koleksiyonda yer alan elemanların türünü belirtir ve tür güvenliğini sağlar.
IEnumerable ve IEnumerator
-
IEnumerablearayüzü bir yineleme başlatmak için kullanılır. Bu başlatma işiniGetEnumerator()metodu aracılığıyla yapar. -
IEnumerator,IEnumerablearayüzünden döndürülen yineleyicidir. Yani, bir koleksiyonun öğeleri arasında dolaşmak içinIEnumeratorkullanılır.-
IEnumeratorşu metodları sağlar: - MoveNext(): Bir sonraki öğeye geçer ve başarı durumunu döner.
- Current: Şu anda işaret edilen öğeyi döner.
- Reset(): Yineleyiciyi başa döndürür.
-
IEnumerable Kullanımına Örnekler
Non-generic IEnumerable
using System;
using System.Collections;
class Program
{
static void Main()
{
ArrayList numbers = new ArrayList() { 1, 2, 3, 4, 5 };
// IEnumerable interface'ini kullanarak üzerinde gezinme
IEnumerable enumerable = numbers;
IEnumerator enumerator = enumerable.GetEnumerator();
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
}
}
Açıklama: Bu örnekte ArrayList gibi non-generic bir koleksiyon üzerinde IEnumerable kullanılarak veriler üzerinde geziniliyor. Burada, GetEnumerator() ile IEnumerator nesnesi elde edilip, MoveNext() ve Current ile sırayla öğeler işleniyor.
Generic IEnumerable<T>
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<string> fruits = new List<string> { "Apple", "Banana", "Cherry" };
// Generic IEnumerable kullanımı
IEnumerable<string> fruitEnum = fruits;
foreach (string fruit in fruitEnum)
{
Console.WriteLine(fruit);
}
}
}
Açıklama: Burada List<string> gibi generic bir koleksiyon üzerinde yineleme yapılıyor. IEnumerable<T> tür güvenliği sağlar ve tip dönüşümleri ile ilgili ekstra işlem yapılmasına gerek kalmaz.
IEnumerable ve IEnumerator İlişkisi
IEnumerable, her ne kadar kendi başına bir koleksiyon üzerinde gezmeyi sağlayan bir arayüz gibi görünse de aslında bu işi IEnumerator aracılığıyla yapar. IEnumerable, sadece bir GetEnumerator metodu sağlar, bu metod ise geri planda IEnumerator döner. Yani, IEnumerator, koleksiyonun öğelerine sırayla erişilmesini sağlayan asıl yapıdır.
Özetle, bu ilişki şu şekilde çalışır:
- Bir
IEnumerablekoleksiyon üzerindeGetEnumeratorçağrıldığında, o koleksiyonun bir yineleyicisi (IEnumerator) elde edilir. -
IEnumerator,MoveNext()metoduyla bir sonraki öğeye geçer veCurrentile o öğeye erişilir. - İşlem bittikten sonra
Reset()ile yineleyici başa döndürülebilir (ancak genellikleforeachkullanıldığında buna gerek kalmaz).
IEnumerable ve IQueryable Arasındaki Fark
-
IEnumerable: Veriyi bellekte işler ve döner. Yani, veriyi çeker ve döngü içerisinde işleme başlar. Tüm veriler bellekte olduğu için daha küçük veri kümeleriyle çalışmak için uygundur. -
IQueryable: Sorguyu veri kaynağına gönderir ve veri kaynağının (örneğin bir veritabanı) işlemesini sağlar. Büyük veri kümeleriyle çalışırken daha performanslı olabilir çünkü sorgu veritabanında çalıştırılır.
IEnumerable ve List<T> Arasındaki Fark
-
IEnumerable<T>: Koleksiyonun sadece üzerinde gezinmenizi sağlar, veri üzerinde değişiklik yapamazsınız. -
List<T>: Hem veri üzerinde değişiklik yapabilir hem de veriler arasında dolaşabilirsiniz (ekleme, silme, güncelleme gibi).
IEnumerable, veri koleksiyonlarını temsil eder; o koleksiyonun kendisi değildir. Bu nedenle, IEnumerable ile veri üzerinde değişiklik yapmak mümkün değildir. Örneğin, bir List<T> türü hem koleksiyonu temsil eder hem de veri üzerinde değişiklik yapmanıza olanak tanır.
IEnumerable‘in Avantajları
Performans:
IEnumerable, özellikle büyük veri kümeleriyle çalışırken lazy evaluation (ertelemeli değerlendirme) kullanarak bellek performansını artırır. Yani, tüm veri setini bellek içine alıp işlemek yerine sadece ihtiyaç duyulan veriler işlenir.Kolaylık:
IEnumerable, koleksiyonlar arasında basit bir iterasyon (yineleme) sağlar ve birden fazla veri türüyle çalışmak için uygundur.Uyumluluk: Farklı veri kaynaklarıyla (diziler, listeler, veritabanları) çalışırken veri üzerinde kolayca dolaşmak mümkündür.
Dezavantajlar
-
Sınırlı Erişim:
IEnumerablesadece ileriye doğru iterasyon sağlar, yani veriler üzerinde geriye dönük dolaşım yapılamaz. -
Yalnızca Okuma:
IEnumerableveriyi sadece okumaya yöneliktir, yani koleksiyon üzerinde değişiklik yapmanıza olanak tanımaz.
IEnumerable İle yield Anahtar Kelimesi
yield anahtar kelimesi, IEnumerable ile birlikte kullanıldığında bir koleksiyonun elemanlarını döndürmek için oldukça kullanışlıdır. Bu, veri işlemeyi daha verimli hale getiren “lazy evaluation” tekniğinin bir parçasıdır.
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
foreach (int number in GetNumbers())
{
Console.WriteLine(number);
}
}
static IEnumerable<int> GetNumbers()
{
yield return 1;
yield return 2;
yield return 3;
}
}
Açıklama: yield, her çağrıldığında sıradaki öğeyi döndürür ve kaldığı yerden devam eder. Bu da hafıza tüketimini azaltır ve sadece ihtiyaç duyulan veriyi işleme alır.
Sonuç
IEnumerable, C# ve .NET Core’da koleksiyonlar üzerinde dolaşmak için temel bir yapı taşıdır. Esnekliği ve basitliği sayesinde veri kaynakları üzerinde işlem yapmayı kolaylaştırır. Yineleme mantığını IEnumerator ile sağlar ve veriyi bellek açısından daha verimli işleyebilir. Özellikle büyük veri kümeleriyle çalışırken yield ve IQueryable gibi diğer yapılarla birlikte kullanıldığında daha verimli sonuçlar elde edilebilir.
This content originally appeared on DEV Community and was authored by Mustafa Çam