मैं IEnumerator.Reset()
विधि के बारे में सोच रहा हूं। मैंने एमएसडीएन दस्तावेज में पढ़ा है कि यह केवल COM इंटरऑप के लिए है। एक सी ++ प्रोग्रामर के रूप में यह मुझे IEnumerator
की तरह दिखता है जो Reset
का समर्थन करता है जो मैं forward iterator पर कॉल करता हूं, जबकि IEnumerator
जो Reset
का समर्थन नहीं करता है वास्तव में input iterator है।क्या सी #+ सी ++ इटरेटर्स जैसे एन्युमरेटर्स के बीच भेद से लाभ होगा?
तो मेरा प्रश्न यह है कि क्या यह समझ सही है?
मेरे प्रश्न का दूसरा भाग यह है कि यदि इनपुट इटरेटर्स और अग्रेषित करने वाले इटरेटर्स (या "एन्युमरेटर्स" को पसंद करते हैं तो) के बीच कोई अंतर होता है तो यह सी # में किसी भी लाभ का होगा? क्या यह प्रोग्रामर के बीच कुछ भ्रम को खत्म करने में मदद नहीं करेगा, जैसा कि इस SO question about cloning iterators में पाया गया है?
संपादित करें: आगे और इनपुट इटरेटर पर स्पष्टीकरण। एक इनपुट इटरेटर केवल गारंटी देता है कि आप संग्रह के सदस्यों (या जनरेटर फ़ंक्शन या इनपुट स्ट्रीम से) केवल एक बार गणना कर सकते हैं। यह ठीक है कि कैसे IENumerator सी # में काम करता है। चाहे आप दूसरी बार गणना कर सकें या नहीं, Reset
समर्थित है या नहीं। एक आगे इटरेटर, इस प्रतिबंध नहीं है। आप जितनी बार चाहें सदस्यों पर गिन सकते हैं।
कुछ सी # प्रोग्रामर कम नहीं करते हैं और IEnumerator
को मल्टीपास एल्गोरिदम में विश्वसनीय रूप से उपयोग नहीं किया जा सकता है। निम्नलिखित मामले पर विचार करें:
void PrintContents(IEnumerator<int> xs)
{
while (iter.MoveNext())
Console.WriteLine(iter.Current);
iter.Reset();
while (iter.MoveNext())
Console.WriteLine(iter.Current);
}
अगर हम इस संदर्भ में PrintContents
कहते हैं, कोई समस्या नहीं: में
IEnumerable<int> GenerateInts() {
System.Random rnd = new System.Random();
for (int i=0; i < 10; ++i)
yield return Rnd.Next();
}
PrintContents(GenerateInts());
हैं IEnumerator
समर्थित Reset
,:
List<int> ys = new List<int>() { 1, 2, 3 }
PrintContents(ys.GetEnumerator());
हालांकि निम्नलिखित को देखो अन्य शब्दों में बहु-पास एल्गोरिदम समर्थित हैं, फिर प्रत्येक बार जब आप संग्रह पर पुनरावृत्त होते हैं तो यह अलग होगा। यह अवांछित होगा, क्योंकि यह आश्चर्यजनक व्यवहार होगा। यह उदाहरण थोड़ा फिक्र है, लेकिन यह वास्तविक दुनिया में होता है (उदाहरण के लिए फ़ाइल स्ट्रीम से पढ़ना)।
मुझे लगता है कि आपका मतलब है 'आईन्यूमेरेटर। रीसेट', 'IEnumerable नहीं। रासेट, है ना? –
हां, धन्यवाद! उसके लिए माफ़ करना। – cdiggins
दिलचस्प सवाल। लेकिन शायद आपको सी ++ की व्याख्या करनी चाहिए - थोड़ा सा बोलें, क्योंकि बहुत सारे सी # प्रोग्रामर इसे देखने जा रहे हैं। यह स्पष्ट नहीं हो सकता है कि एक इनपुट इटरेटर और आगे इटरेटर क्या है, बिल्कुल (विशेष रूप से, उनमें से एकल/मल्टीपास क्षमताओं, जो कि इस प्रश्न के लिए वास्तव में प्रासंगिक हैं) – jalf