Özel Enumerable'lar
Yineleyicilerle IEnumerable uygulayın.
Özel Enumerable'lar, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
Kendi Numaralandırılabilir Türünüzü Oluşturma
Bir sınıfta IEnumerable<T> uygulayarak onu bir foreach içinde kullanılabilir hâle getirirsiniz. Yineleyici yöntemleriyle birlikte bu, çok az kodla özel koleksiyonlar ve aralıklar oluşturmanızı sağlar.
GetEnumerator'ı yield ile Uygulama
IEnumerable<T> uygulamanın en basit yolu, GetEnumerator'ı yield return kullanarak bir yineleyici şeklinde yazmaktır. Derleyici, numaralandırıcıyı sizin için oluşturur.
using System;
using System.Collections;
using System.Collections.Generic;
public class IntRange : IEnumerable<int>
{
private readonly int _start, _count;
public IntRange(int start, int count) { _start = start; _count = count; }
public IEnumerator<int> GetEnumerator()
{
for (int i = 0; i < _count; i++)
yield return _start + i;
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
public class Program
{
public static void Main()
{
foreach (var n in new IntRange(5, 4))
Console.WriteLine(n);
}
}Neden İki GetEnumerator Yöntemi Var?
IEnumerable<T>, genel olmayan IEnumerable türünden miras alır; bu nedenle ikisini de uygulamanız gerekir. Açıkça uygulanan genel olmayan sürüm, işi basitçe genel sürüme devreder.
using System;
using System.Collections;
using System.Collections.Generic;
public class Letters : IEnumerable<char>
{
public IEnumerator<char> GetEnumerator()
{
yield return 'x';
yield return 'y';
yield return 'z';
}
// Required because IEnumerable<T> extends IEnumerable
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
public class Program
{
public static void Main()
{
foreach (var c in new Letters())
Console.WriteLine(c);
}
}Özel Mantığı Kapsülleme
Özel bir numaralandırılabilir tür, karmaşık üretim kurallarını temiz bir türün arkasında gizleyebilir. Burada bir sınıf, seçilen uzunlukta bir Fibonacci dizisi üretir.
using System;
using System.Collections;
using System.Collections.Generic;
public class Fibonacci : IEnumerable<int>
{
private readonly int _count;
public Fibonacci(int count) { _count = count; }
public IEnumerator<int> GetEnumerator()
{
int a = 0, b = 1;
for (int i = 0; i < _count; i++)
{
yield return a;
int next = a + b; a = b; b = next;
}
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
public class Program
{
public static void Main()
{
foreach (var n in new Fibonacci(8))
Console.WriteLine(n);
}
}Dahili Bir Koleksiyonu Sarmalama
Özel bir numaralandırılabilir tür, çoğu zaman dahili depolamayı sarmalar; öğelerin eklenme veya süzülme biçimini denetlerken yinelemeye izin verir.
using System;
using System.Collections;
using System.Collections.Generic;
public class EvenBag : IEnumerable<int>
{
private readonly List<int> _items = new List<int>();
public void Add(int n) { if (n % 2 == 0) _items.Add(n); }
public IEnumerator<int> GetEnumerator() => _items.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
public class Program
{
public static void Main()
{
var bag = new EvenBag();
bag.Add(1); bag.Add(2); bag.Add(3); bag.Add(4);
foreach (var n in bag) Console.WriteLine(n);
}
}Özel Numaralandırılabilir Türler LINQ ile Çalışır
IEnumerable<T> uygulayan her tür, tüm LINQ özelliklerini anında kazanır. Özel koleksiyonunuz ek bir çaba harcamadan süzülebilir, dönüştürülebilir ve toplulaştırılabilir.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
public class IntRange : IEnumerable<int>
{
private readonly int _start, _count;
public IntRange(int start, int count) { _start = start; _count = count; }
public IEnumerator<int> GetEnumerator()
{
for (int i = 0; i < _count; i++) yield return _start + i;
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
public class Program
{
public static void Main()
{
var range = new IntRange(1, 10);
Console.WriteLine(range.Where(n => n % 3 == 0).Sum());
}
}Her foreach Yeni Bir Numaralandırıcı Alır
Her yineleme yaptığınızda GetEnumerator çağrıldığı için özel bir numaralandırılabilir tür tekrar tekrar numaralandırılabilir; her geçiş baştan başlar.
using System;
using System.Collections;
using System.Collections.Generic;
public class IntRange : IEnumerable<int>
{
private readonly int _count;
public IntRange(int count) { _count = count; }
public IEnumerator<int> GetEnumerator()
{
for (int i = 1; i <= _count; i++) yield return i;
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
public class Program
{
public static void Main()
{
var r = new IntRange(3);
foreach (var n in r) Console.Write(n);
Console.WriteLine();
foreach (var n in r) Console.Write(n); // fresh again
Console.WriteLine();
}
}Genel Özel Numaralandırılabilir Tür
Herhangi bir öğe türünü tutabilmesi için numaralandırılabilir türü genel hâle getiriniz. Burada basit bir halka, öğelerini seçilen başlangıç konumundan başlayarak sırayla sunar.
using System;
using System.Collections;
using System.Collections.Generic;
public class Ring<T> : IEnumerable<T>
{
private readonly T[] _items;
private readonly int _start;
public Ring(T[] items, int start) { _items = items; _start = start; }
public IEnumerator<T> GetEnumerator()
{
for (int i = 0; i < _items.Length; i++)
yield return _items[(_start + i) % _items.Length];
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
public class Program
{
public static void Main()
{
var ring = new Ring<string>(new[] { "a", "b", "c", "d" }, 2);
foreach (var s in ring) Console.WriteLine(s);
}
}Tembel Özel Numaralandırılabilir Türler
GetEnumerator kendisi bir yineleyici olduğundan, özel numaralandırılabilir türünüz varsayılan olarak tembeldir: öğeler yalnızca tüketici onları istediğinde üretilir.
using System;
using System.Collections;
using System.Collections.Generic;
public class Squares : IEnumerable<int>
{
private readonly int _count;
public Squares(int count) { _count = count; }
public IEnumerator<int> GetEnumerator()
{
for (int i = 1; i <= _count; i++)
{
Console.WriteLine("computing " + i);
yield return i * i;
}
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
public class Program
{
public static void Main()
{
foreach (var n in new Squares(3))
Console.WriteLine("got " + n);
}
}Ne Zaman Özel Numaralandırılabilir Tür Oluşturmalı
Yineleme sırası veya üretim mantığı bir türün temel parçası olduğunda, örneğin ağaç dolaşımında, sayfalı veri kaynağında ya da matematiksel bir dizide, özel bir numaralandırılabilir türe başvurunuz. Aksi durumda sıradan bir yineleyici yöntemi yeterlidir.
using System;
using System.Collections;
using System.Collections.Generic;
public class Countdown : IEnumerable<int>
{
private readonly int _from;
public Countdown(int from) { _from = from; }
public IEnumerator<int> GetEnumerator()
{
for (int i = _from; i >= 0; i--) yield return i;
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
public class Program
{
public static void Main()
{
foreach (var n in new Countdown(5)) Console.WriteLine(n);
}
}Kendiniz Deneyiniz
Geometrik bir dizi üreten özel bir numaralandırılabilir tür oluşturunuz, ardından üzerinde LINQ kullanınız. Türünüz tüm ekosisteme doğrudan bağlanır.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
public class Geometric : IEnumerable<int>
{
private readonly int _start, _ratio, _count;
public Geometric(int start, int ratio, int count) { _start = start; _ratio = ratio; _count = count; }
public IEnumerator<int> GetEnumerator()
{
int value = _start;
for (int i = 0; i < _count; i++) { yield return value; value *= _ratio; }
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
public class Program
{
public static void Main()
{
var seq = new Geometric(1, 2, 6);
Console.WriteLine(string.Join(", ", seq));
Console.WriteLine("sum: " + seq.Sum());
}
}Hızlı Kontrol
IEnumerable
Özet
Özel bir numaralandırılabilir tür, IEnumerable<T> uygulayarak foreach ve LINQ ile çalışır.
GetEnumerator'ıyield returnile bir yineleyici olarak uygulayınız.- Ayrıca açıkça uygulanan genel olmayan
GetEnumeratoryöntemini sağlayınız. - Her yineleme yeni bir numaralandırıcı alır.
- Yineleme varsayılan olarak tembeldir.
Sıkça Sorulan Sorular
“Özel Enumerable'lar” dersi ücretsiz mi?
Evet — “Özel Enumerable'lar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Özel Enumerable'lar” dersinde ne öğreneceğim?
Yineleyicilerle IEnumerable uygulayın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Özel Enumerable'lar” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- yield return ile Yineleyici Yöntemleri
- yield break ve Erken Sonlandırma
- Tembel Değerlendirme Anlambilimi
- Özel Enumerable'lar