2011-06-21 9 views
57

मैं अपने कस्टम संग्रह (एक पेड़) के लिए IENumerable को लागू करने के बारे में सोच रहा हूं, इसलिए मैं अपने पेड़ को पार करने के लिए foreach का उपयोग कर सकते हैं। हालांकि जहां तक ​​मुझे पता है कि foreach हमेशा संग्रह के पहले तत्व से शुरू होता है। मैं चुनना चाहता हूं कि कौन सा तत्व foreach शुरू होता है। क्या किसी भी तरह से उस तत्व को बदलना संभव है जिससे फोरच शुरू होता है?क्या पहले इस्तेमाल करने के अलावा पहले किसी तत्व से पुनरावृत्ति करना प्रारंभ करना संभव है?

+0

मैं कम से कम विस्मय के सिद्धांत का पालन करता हूं: http://en.wikipedia.org/wiki/Principle_of_least_astonishment – ChaosPandion

+0

यदि आप पहले तत्व से प्रारंभ नहीं करते हैं, तो आप इटरेटर के व्यवहार को कैसे परिभाषित करते हैं? अनुक्रम के अंत तक पहुंचने पर क्या होता है? क्या यह पहले तत्व पर वापस जाता है और शेष तत्वों पर फिर से चला जाता है? –

+0

@ कैओसपैंडियन की टिप्पणी वह जगह है जहां मैं उन प्रश्नों के साथ जा रहा था। :) –

उत्तर

101

हां।

Collection<string> myCollection = new Collection<string>; 

foreach (string curString in myCollection.Skip(3)) 
    //Dostuff 

Skip एक IEnumerable समारोह है कि हालांकि कई आप वर्तमान सूचकांक पर शुरू निर्दिष्ट छोड़ देता है: निम्न कार्य करें। दूसरी ओर, यदि आप उपयोग करने के लिए केवल पहले तीन आप का प्रयोग करेंगे चाहते थे .Take:

foreach (string curString in myCollection.Take(3)) 

ये भी एक साथ रखा जा सकता है, अगर आप केवल 4-6 आइटम चाहता था तुम कर सकते हो तो:

foreach (string curString in myCollection.Skip(3).Take(3)) 
+2

ध्यान दें कि सी # केस-संवेदी है, इसलिए उनमें से कोई भी दिखाए गए अनुसार काम नहीं करेगा ... –

+0

अच्छी कॉल। डब्ल्यूटीबी ऑटो-पूर्ण (गहह इसे वास्तविक नाम याद नहीं कर सकता); स्टैक ओवरफ्लो में;) – MoarCodePlz

+0

क्या यह वास्तव में छोड़ देता है या यह सिर्फ एक प्रतिलिपि बनाता है? अर्थात।क्या ये दोनों अलग होंगे: 'foreach (पंक्ति पंक्ति पंक्तियों में पंक्ति। (1)) { पंक्ति [0] = "newInfo"; } ' बनाम ' के लिए (int i = 1; मैं पंक्ति = पंक्तियों [i]; पंक्ति [0] = "newStuff"; } ' – TigerBear

4

आप कुछ तत्वों को छोड़ने के लिए Enumerable.Skip का उपयोग कर सकते हैं, और इसे वहां शुरू कर सकते हैं।

उदाहरण के लिए:

foreach(item in theTree.Skip(9)) // Skips the first 9 items 
{ 
    // Do something 

हालांकि, अगर आप एक पेड़ लिख रहे हैं, तो आप पेड़ स्वयं आइटम है कि एक नए IEnumerable<T> जो वहाँ नीचे से गणना होगा वापस आ जाएगी पर एक सदस्य प्रदान करने के लिए चाहते हो सकता है। यह संभवतः लंबे समय तक अधिक उपयोगी होगा।

+0

कुछ 'IENumerable सबट्री (रूट इंडेक्स)' की तरह कुछ? अच्छा निर्णय! –

+0

उत्तर देने के लिए धन्यवाद, छोड़ने के बारे में एमएसडीएन जानकारी पढ़ने के लिए आशाजनक लग रहा है, मुझे यह निष्कर्ष निकाला गया कि संभवतः एक विधि लिखना संभव है स्टार्टफ्रॉम (यह आईन्यूमेरेबल पेड़, माईट्रीएमेंट तत्व) जो आईनेमेरेबल के लिए एक विस्तार विधि होगी जो आईनेमरेबल लौटाएगा जिससे मुझे पुनरावृत्ति शुरू करनी चाहिए। तो शायद मैं इस विधि का उपयोग foreach के रूप में कर सकता हूं (पेड़ में var तत्व। स्टार्टफ्रॉम (कुछ एलिमेंट))। – inferno

+0

@inferno: हाँ, आप आसानी से ऐसा कर सकते हैं। हालांकि, मैं केवल MyTreeElement में एक विधि/प्रॉपर्टी जोड़ूंगा जो कि अधिक था: 'आईनेमरेबल Children', ताकि आप बस ऐसा कर सकें:' foreach (someElement.Children में var item) '- विस्तार विधियों का उपयोग करने से कहीं अधिक स्पष्ट IMO। –

15

यह इस के लिए वस्तुओं के लिए LINQ में Skip विधि का उपयोग करने, तत्वों की दी गई संख्या को छोड़ने के लिए सबसे आसान है: किसी अन्य मूल्य तत्वों की एक अलग संख्या को छोड़ने के लिए के लिए

foreach (var value in sequence.Skip(1)) // Skips just one value 
{ 
    ... 
} 

1 जाहिर है सिर्फ बदल ..

इसी तरह आप लौटाए गए तत्वों की संख्या को सीमित करने के लिए Take का उपयोग कर सकते हैं।

आप my Edulinq blog series में इन दोनों (और संबंधित SkipWhile और TakeWhile विधियों) के बारे में अधिक पढ़ सकते हैं।

+0

जॉन, अगर यह "अनुक्रम" शून्य है तो क्या यह अपवाद का जोखिम नहीं चलाता है? – WEFX

+0

@WEFX: ठीक है, हमें नहीं पता कि 'अनुक्रम' वैध रूप से 'शून्य' हो सकता है या नहीं। संभवतः ओपी स्वयं को संभाल सकता है - यह वास्तव में सवाल का हिस्सा नहीं है ... –

-1

ForeachIEnumerable के कार्यान्वयन द्वारा परिभाषित तरीके से आपके संग्रह पर फिर से शुरू होगा। इसलिए, हालांकि आप तत्वों को छोड़ सकते हैं (ऊपर बताए गए अनुसार), आप अभी भी उसी क्रम में तत्वों पर तकनीकी रूप से पुनरावृत्ति कर रहे हैं।

सुनिश्चित नहीं है कि आप क्या हासिल करने की कोशिश कर रहे हैं, लेकिन आपकी कक्षा में IEnumerable गुण हो सकते हैं, जिनमें से प्रत्येक एक विशिष्ट क्रम में तत्वों को दर्शाता है।

संबंधित मुद्दे

 संबंधित मुद्दे