2011-09-05 19 views
48

मुझे याद है कि कैसे (लेकिन क्यों नहीं) IEnumerator एस का उपयोग सी # में करना है। मैं अपने अद्भुत दस्तावेज़ीकरण के साथ जावा में उपयोग किया जाता हूं जो शुरुआती लोगों को काफी अच्छी तरह से बताता है। तो कृपया धीरज रखें।सरल आईएन्यूमेरेटर उपयोग (उदाहरण के साथ)

मैंने इन बोर्डों के अन्य उत्तरों से सीखने का कोई फायदा नहीं लिया है। एक सामान्य प्रश्न पूछने के बजाय जो पहले से ही पूछा जा चुका है, मेरे पास एक विशिष्ट उदाहरण है जो मेरे लिए चीजों को स्पष्ट करेगा।

मान लीजिए मेरे पास एक तरीका है जिसे IEnumerable<String> ऑब्जेक्ट पास करने की आवश्यकता है। सभी विधि को करने की आवश्यकता है roxxors अक्षरों में प्रत्येक String के अंत में अक्षरों को जोड़ना है। यह फिर इस नए इटेटरेटर को वापस कर देगा (बेशक मूल IEnumerable ऑब्जेक्ट छोड़ दिया गया था)।

मैं इसके बारे में कैसे जाऊं? यहां जवाब, मेरे अलावा इन वस्तुओं के बारे में बुनियादी सवालों के साथ कई लोगों की मदद करनी चाहिए।

private IEnumerable<string> DoWork(IEnumerable<string> data) 
{ 
    List<string> newData = new List<string>(); 
    foreach(string item in data) 
    { 
     newData.Add(item + "roxxors"); 
    } 
    return newData; 
} 

सरल सामान :)

उत्तर

78

यहां IEnumerator पर प्रलेखन है। उनका उपयोग सूचियों के मूल्यों को प्राप्त करने के लिए किया जाता है, जहां लंबाई को समय से पहले जरूरी नहीं माना जाता है (भले ही यह हो सकता है)। यह शब्द enumerate से आता है, जिसका अर्थ है "गिनती या नाम एक करके"।

IEnumerator और IEnumerator<T> सब IEnumerable और IEnumerable<T> इंटरफेस द्वारा प्रदान की जाती है GetEnumerator() के माध्यम से .NET में (उत्तरार्द्ध दोनों प्रदान करते हुए)। यह महत्वपूर्ण है क्योंकि foreach कथन उन इंटरफेस विधियों के माध्यम से सीधे गणनाकर्ताओं के साथ काम करने के लिए डिज़ाइन किया गया है।

उदाहरण के लिए

तो:

IEnumerator enumerator = enumerable.GetEnumerator(); 

while (enumerator.MoveNext()) 
{ 
    object item = enumerator.Current; 
    // Perform logic on the item 
} 

बन जाता है:

foreach(object item in enumerable) 
{ 
    // Perform logic on the item 
} 

अपने विशिष्ट परिदृश्य के लिए के रूप में, लगभग .NET में सभी संग्रह IEnumerable लागू।

public IEnumerator Enumerate(IEnumerable enumerable) 
{ 
    // List implements IEnumerable, but could be any collection. 
    List<string> list = new List<string>(); 

    foreach(string value in enumerable) 
    { 
     list.Add(value + "roxxors"); 
    } 
    return list.GetEnumerator(); 
} 
+0

रीसेट() को foreach द्वारा नहीं कहा जाता है। यह COM इंटरऑप के लिए है, और सभी गणक इसका समर्थन नहीं करते हैं (वास्तव में अधिकांश गणक * इसका समर्थन नहीं करते हैं)। –

+0

गणक केवल पढ़ने के लिए, सही हैं? मैं ऐसे पैटर्न का उपयोग करके अपने संशोधनों वाले एक प्रकार का गणक कैसे लौटा सकता हूं? – BlackVegetable

+0

@ मार्टिन्हो आप सही हैं। –

5

मैं की तरह कुछ करना चाहते हैं।

उदा।

IEnumerable<string> myMethod(IEnumerable<string> sequence) 
{ 
    foreach(string item in sequence) 
    { 
     yield return item + "roxxors"; 
    } 
} 
+0

पढ़ें यह मेरी पहली सोचा था। हालांकि, जिन तरीकों से मैं बातचीत करता हूं, उन्हें मुझे एक आईनेमरेबल प्रकार या somesuch वापस करने की आवश्यकता होती है। हालांकि प्रतिक्रिया के लिए धन्यवाद! – BlackVegetable

+0

@ ब्लैकवेजटेबल: 'सूची 'एक' IENumerable 'है। लेकिन हाँ, ऐसा करने के बेहतर तरीके हैं ('उपज' का उपयोग करके)। –

+1

मुझे याद है कि आपको IENumerable के रूप में घोषित विधि में एक सूची वापस न करने का प्रयास करना चाहिए। इसका कारण यह है कि लोग "धोखा" सकते हैं और वास्तव में इसकी एक सूची देख सकते हैं और इसके साथ सूची चीजें करना शुरू कर सकते हैं। सूची (और वास्तव में सभी IENumerables) में एक AsNumerable() विधि है जो मुझे लगता है कि कहा जाना चाहिए और लौटाया जाना चाहिए। – Chris

8

तो मैं सी # में तो सही ढंग से आप समझ yield return संकलक जादू आप सभी की जरूरत है मुझे लगता है कि:

+0

तो इस मामले में उपज प्रत्येक बार चलाने पर सूची से एक एकल (संशोधित) स्ट्रिंग वापस कर देगा? या यह किसी प्रकार की आईनेमरेबल ऑब्जेक्ट लौटाएगा? – BlackVegetable

+0

@ ब्लैकवेजेटेबल हां, यह एक 'आईनेमरेबल' ऑब्जेक्ट लौटाएगा जो प्रत्येक बार 'मूवनेक्स्ट' कहलाता है (या तो सीधे या परोक्ष रूप से फोरैच के साथ) स्ट्रिंग का निर्माण करेगा –

+0

हां, यह वाक्य रचनात्मक चीनी है, यह संकलक को इसे चालू करने के लिए कहता है एक इटरेटर ब्लॉक में। यहां देखें http://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx –

12
public IEnumerable<string> Appender(IEnumerable<string> strings) 
{ 
    List<string> myList = new List<string>(); 
    foreach(string str in strings) 
    { 
     myList.Add(str + "roxxors"); 
    } 
    return myList; 
} 

या

public IEnumerable<string> Appender(IEnumerable<string> strings) 
{ 
    foreach(string str in strings) 
    { 
     yield return str + "roxxors"; 
    } 
} 

yield construct का उपयोग कर, या बस

var newCollection = strings.Select(str => str + "roxxors"); //(*) 

या

var newCollection = from str in strings select str + "roxxors"; //(**) 
: इस कारण से, आप निम्न कर सकते

जहां दो बाद वाले LINQ और (**)(*) के लिए सिंटैक्टिक चीनी है।

+0

LINQ के साथ दिलचस्प पैटर्न। मुझे इसका शोध करना होगा। आपकी (तेज़) मदद के लिए सभी को धन्यवाद! – BlackVegetable

+0

मुझे याद है कि आपको IENumerable के रूप में घोषित विधि में एक सूची वापस न करने का प्रयास करना चाहिए। इसका कारण यह है कि लोग "धोखा" सकते हैं और वास्तव में इसकी एक सूची देख सकते हैं और इसके साथ सूची चीजें करना शुरू कर सकते हैं। सूची (और वास्तव में सभी IENumerables) में एक AsNumerable() विधि है जो मुझे लगता है कि कहा जाना चाहिए और लौटाया जाना चाहिए। अन्यथा उपज और विशेष रूप से linq प्रतिक्रियाओं के लिए शीर्ष जवाब। :) – Chris

+0

यदि आप सी # में पर्याप्त मात्रा में विकास करने की योजना बना रहे हैं तो आप निश्चित रूप से LINQ में कुछ समय निवेश करना चाहते हैं - यह आपको बहुत समय बचाएगा और आपको अपने कोड के बारे में बेहतर महसूस करेगा :-) – Rune

4

इसके अलावा, आप उपयोग कर सकते हैं LINQ का चयन विधि:

var source = new[] { "Line 1", "Line 2" }; 

var result = source.Select(s => s + " roxxors"); 

अधिक यहाँ Enumerable.Select Method