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,
IEnumerable
arayüzünü uygulayan her sınıf,foreach
döngüsü gibi yapıların kullanılmasını sağlar. - Koleksiyon türüne bağlı olarak,
IEnumerable
koleksiyonun 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
-
IEnumerable
arayüzü bir yineleme başlatmak için kullanılır. Bu başlatma işiniGetEnumerator()
metodu aracılığıyla yapar. -
IEnumerator
,IEnumerable
arayüzünden döndürülen yineleyicidir. Yani, bir koleksiyonun öğeleri arasında dolaşmak içinIEnumerator
kullanı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
IEnumerable
koleksiyon üzerindeGetEnumerator
çağrıldığında, o koleksiyonun bir yineleyicisi (IEnumerator
) elde edilir. -
IEnumerator
,MoveNext()
metoduyla bir sonraki öğeye geçer veCurrent
ile o öğeye erişilir. - İşlem bittikten sonra
Reset()
ile yineleyici başa döndürülebilir (ancak genellikleforeach
kullanı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:
IEnumerable
sadece ileriye doğru iterasyon sağlar, yani veriler üzerinde geriye dönük dolaşım yapılamaz. -
Yalnızca Okuma:
IEnumerable
veriyi 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.
Top comments (0)