Custom koleksiyon
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
-
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.
-
Arayüzü uygula
class NumberBag : IEnumerable<____>Cevabı göster
class NumberBag : IEnumerable<int> -
Parçayı rolüne eşle
- Add
- Eleman ekler
- GetEnumerator
- İteratör verir
- _items
- İç liste
- IEnumerable<T>
- Yineleme sözleşmesi