CodeBlanks Logo Icon CodeBlanks

Custom koleksiyon

C# kursu · Orta seviye · Ders 85/116

Kendi IEnumerable<T> uygulayan koleksiyonunu yazmayı öğrenirsin.

Kendi koleksiyonunu yaz

Bir sınıfa IEnumerable<T> uygularsan foreach desteği kazanır. İçte bir List<T> tutup GetEnumerator metodunu ona yönlendirmek en kolay yoldur.

Örnek: class NumberBag : IEnumerable<int>. İçine Add metodu eklersin; GetEnumerator içinde _items.GetEnumerator() döndürürsün. Artık foreach (var n in bag) yazabilirsin.

GetEnumerator nasıl yazılır

IEnumerable<T> iki GetEnumerator yöntemi ister: biri IEnumerator<T> döndüren genel, diğeri IEnumerator döndüren genel olmayan. İçteki listeye yönlendirmek en kolayıdır.

Genel olmayan sürüm, eski foreach uyumluluğu içindir. İmza: IEnumerator IEnumerable.GetEnumerator() => _items.GetEnumerator();. İki yöntem de aynı iç listeye yönlendirirse koleksiyon hazır demektir.

Uygulama NumberBag koleksiyonu yaz

Aşağıdaki NumberBag sınıfı IEnumerable<int> uygular ama GetEnumerator eksik. Genel GetEnumerator yöntemini ekle ve _items.GetEnumerator() döndür. Main içinde foreach ile her elemanı yazdır.

Örnek çözümü göster
GetEnumerator yöntemini public IEnumerator<int> GetEnumerator() { return _items.GetEnumerator(); } şeklinde yaz. Main'de foreach (var n in bag) Console.WriteLine(n); ekle.
Örnek çözüm:
using System;
using System.Collections;
using System.Collections.Generic;

class NumberBag : IEnumerable<int>
{
    private List<int> _items = new List<int>();

    public void Add(int n) => _items.Add(n);

    public IEnumerator<int> GetEnumerator()
    {
        return _items.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator() => _items.GetEnumerator();

    static void Main()
    {
        var bag = new NumberBag();
        bag.Add(1);
        bag.Add(2);
        bag.Add(3);
        foreach (var n in bag)
        {
            Console.WriteLine(n);
        }
    }
}

Kendini test et

  1. foreach için hangi arayüz?

    • IDisposable
    • IClonable
    • IComparable
    • IEnumerable<T>
    Cevabı göster

    IEnumerable<T> — Doğru. IEnumerable<T> uygulayan sınıflar foreach ile gezilir.

  2. Arayüzü uygula

    class NumberBag : IEnumerable<____>
    Cevabı göster
    class NumberBag : IEnumerable<int>
  3. Parçayı rolüne eşle

    Add
    Eleman ekler
    GetEnumerator
    İteratör verir
    _items
    İç liste
    IEnumerable<T>
    Yineleme sözleşmesi

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