DEV Community

Mustafa  Çam
Mustafa Çam

Posted on

IEnumerable nedir ?

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:

  1. IEnumerable (non-generic): Koleksiyonun elemanlarının türünü belirtmez.
  2. 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şini GetEnumerator() metodu aracılığıyla yapar.
  • IEnumerator, IEnumerable arayüzünden döndürülen yineleyicidir. Yani, bir koleksiyonun öğeleri arasında dolaşmak için IEnumerator 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);
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

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);
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

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:

  1. Bir IEnumerable koleksiyon üzerinde GetEnumerator çağrıldığında, o koleksiyonun bir yineleyicisi (IEnumerator) elde edilir.
  2. IEnumerator, MoveNext() metoduyla bir sonraki öğeye geçer ve Current ile o öğeye erişilir.
  3. İşlem bittikten sonra Reset() ile yineleyici başa döndürülebilir (ancak genellikle foreach 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;
    }
}
Enter fullscreen mode Exit fullscreen mode

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)