कस्टम एन्यूमेरेबल
इटरेटर से IEnumerable लागू करें।
कस्टम एन्यूमेरेबल, CoddyKit पर C# अकादमी का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C# अकादमी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
अपना क्रमणीय संग्रह बनाना
किसी क्लास पर IEnumerable<T> लागू करके आप उसे foreach में उपयोग योग्य बनाते हैं। इटरेटर विधियों के साथ मिलकर यह आपको बहुत कम कोड में कस्टम संग्रह और परास बनाने देता है।
GetEnumerator को yield के साथ लागू करना
IEnumerable<T> लागू करने का सबसे सरल तरीका है कि GetEnumerator को yield return का उपयोग करने वाले इटरेटर के रूप में लिखें। कंपाइलर आपके लिए क्रमक बना देता है।
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);
}
}GetEnumerator की दो विधियाँ क्यों
IEnumerable<T> गैर-सामान्य IEnumerable से विरासत में मिलता है, इसलिए आपको दोनों लागू करने पड़ते हैं। स्पष्ट रूप से लागू की गई गैर-सामान्य विधि केवल सामान्य संस्करण को सौंप देती है।
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);
}
}कस्टम तर्क को समाहित करना
कस्टम क्रमणीय संग्रह जटिल निर्माण नियमों को एक साफ़ प्रकार के पीछे छिपा सकता है। यहाँ एक क्लास चुनी गई लंबाई का Fibonacci अनुक्रम लौटाती है।
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);
}
}आंतरिक संग्रह को लपेटना
कस्टम क्रमणीय संग्रह अक्सर आंतरिक भंडारण को लपेटता है और item पर क्रम से चलने की सुविधा देते हुए यह नियंत्रित करता है कि item कैसे जोड़े या छाँटे जाएँ।
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);
}
}कस्टम क्रमणीय संग्रह LINQ के साथ काम करते हैं
IEnumerable<T> लागू करने वाले किसी भी प्रकार को तुरंत LINQ की सभी सुविधाएँ मिल जाती हैं। आपके कस्टम संग्रह पर बिना किसी अतिरिक्त लागत के छनाई, रूपांतरण और समूहीकरण किया जा सकता है।
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());
}
}हर पुनरावृत्ति को नया क्रमक मिलता है
हर बार क्रम से चलने पर GetEnumerator को कॉल किया जाता है, इसलिए कस्टम क्रमणीय संग्रह को बार-बार पढ़ा जा सकता है और हर बार शुरुआत नए सिरे से होती है।
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();
}
}जेनेरिक कस्टम क्रमणीय संग्रह
किसी भी तत्व प्रकार को रखने के लिए क्रमणीय संग्रह को जेनेरिक बनाएँ। यहाँ एक सरल ring चुने गए ऑफ़सेट से शुरू करके अपने item को क्रम में दिखाता है।
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);
}
}विलंबित कस्टम क्रमणीय संग्रह
चूँकि GetEnumerator स्वयं एक इटरेटर है, आपका कस्टम क्रमणीय संग्रह डिफ़ॉल्ट रूप से विलंबित होता है: item केवल तभी बनाए जाते हैं जब उपभोक्ता उन्हें माँगता है।
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);
}
}कस्टम क्रमणीय संग्रह कब बनाएँ
जब क्रम से चलने का क्रम या निर्माण-तर्क किसी प्रकार का मुख्य भाग हो, तब कस्टम क्रमणीय संग्रह बनाएँ—जैसे वृक्ष का भ्रमण, पृष्ठांकित डेटा source या गणितीय अनुक्रम। अन्यथा एक साधारण इटरेटर विधि पर्याप्त है।
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);
}
}स्वयं आज़माएँ
Geometric अनुक्रम बनाने वाला कस्टम क्रमणीय संग्रह बनाएँ, फिर उस पर LINQ का उपयोग करें। आपका प्रकार पूरे पारिस्थितिकी तंत्र में सीधे काम करेगा।
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());
}
}त्वरित जाँच
IEnumerable
पुनरावलोकन
कस्टम क्रमणीय संग्रह IEnumerable<T> लागू करता है, इसलिए वह foreach और LINQ के साथ काम करता है।
GetEnumeratorकोyield returnवाले इटरेटर के रूप में लागू करें।- स्पष्ट रूप से लागू की गई गैर-सामान्य
GetEnumeratorभी दें। - हर पुनरावृत्ति को नया क्रमक मिलता है।
- क्रम से चलना डिफ़ॉल्ट रूप से विलंबित होता है।
एआई शिक्षक के साथ C# सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 93
- पाठ
- 346
अक्सर पूछे जाने वाले प्रश्न
क्या “कस्टम एन्यूमेरेबल” पाठ निःशुल्क है?
हाँ—“कस्टम एन्यूमेरेबल” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C# अकादमी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“कस्टम एन्यूमेरेबल” में मैं क्या सीखूँगा?
इटरेटर से IEnumerable लागू करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C# अकादमी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C# अकादमी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C# अकादमी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।
“कस्टम एन्यूमेरेबल” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C# अकादमी पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C# अकादमी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।