मैं अपने कस्टम संग्रह (एक पेड़) के लिए IENumerable को लागू करने के बारे में सोच रहा हूं, इसलिए मैं अपने पेड़ को पार करने के लिए foreach का उपयोग कर सकते हैं। हालांकि जहां तक मुझे पता है कि foreach हमेशा संग्रह के पहले तत्व से शुरू होता है। मैं चुनना चाहता हूं कि कौन सा तत्व foreach शुरू होता है। क्या किसी भी तरह से उस तत्व को बदलना संभव है जिससे फोरच शुरू होता है?क्या पहले इस्तेमाल करने के अलावा पहले किसी तत्व से पुनरावृत्ति करना प्रारंभ करना संभव है?
उत्तर
हां।
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))
ध्यान दें कि सी # केस-संवेदी है, इसलिए उनमें से कोई भी दिखाए गए अनुसार काम नहीं करेगा ... –
अच्छी कॉल। डब्ल्यूटीबी ऑटो-पूर्ण (गहह इसे वास्तविक नाम याद नहीं कर सकता); स्टैक ओवरफ्लो में;) – MoarCodePlz
क्या यह वास्तव में छोड़ देता है या यह सिर्फ एक प्रतिलिपि बनाता है? अर्थात।क्या ये दोनों अलग होंगे: 'foreach (पंक्ति
आप कुछ तत्वों को छोड़ने के लिए Enumerable.Skip का उपयोग कर सकते हैं, और इसे वहां शुरू कर सकते हैं।
उदाहरण के लिए:
foreach(item in theTree.Skip(9)) // Skips the first 9 items
{
// Do something
हालांकि, अगर आप एक पेड़ लिख रहे हैं, तो आप पेड़ स्वयं आइटम है कि एक नए IEnumerable<T>
जो वहाँ नीचे से गणना होगा वापस आ जाएगी पर एक सदस्य प्रदान करने के लिए चाहते हो सकता है। यह संभवतः लंबे समय तक अधिक उपयोगी होगा।
कुछ 'IENumerable
उत्तर देने के लिए धन्यवाद, छोड़ने के बारे में एमएसडीएन जानकारी पढ़ने के लिए आशाजनक लग रहा है, मुझे यह निष्कर्ष निकाला गया कि संभवतः एक विधि लिखना संभव है स्टार्टफ्रॉम (यह आईन्यूमेरेबल
@inferno: हाँ, आप आसानी से ऐसा कर सकते हैं। हालांकि, मैं केवल MyTreeElement में एक विधि/प्रॉपर्टी जोड़ूंगा जो कि अधिक था: 'आईनेमरेबल
यह इस के लिए वस्तुओं के लिए LINQ में Skip
विधि का उपयोग करने, तत्वों की दी गई संख्या को छोड़ने के लिए सबसे आसान है: किसी अन्य मूल्य तत्वों की एक अलग संख्या को छोड़ने के लिए के लिए
foreach (var value in sequence.Skip(1)) // Skips just one value
{
...
}
1 जाहिर है सिर्फ बदल ..
इसी तरह आप लौटाए गए तत्वों की संख्या को सीमित करने के लिए Take
का उपयोग कर सकते हैं।
आप my Edulinq blog series में इन दोनों (और संबंधित SkipWhile
और TakeWhile
विधियों) के बारे में अधिक पढ़ सकते हैं।
जॉन, अगर यह "अनुक्रम" शून्य है तो क्या यह अपवाद का जोखिम नहीं चलाता है? – WEFX
@WEFX: ठीक है, हमें नहीं पता कि 'अनुक्रम' वैध रूप से 'शून्य' हो सकता है या नहीं। संभवतः ओपी स्वयं को संभाल सकता है - यह वास्तव में सवाल का हिस्सा नहीं है ... –
Foreach
IEnumerable
के कार्यान्वयन द्वारा परिभाषित तरीके से आपके संग्रह पर फिर से शुरू होगा। इसलिए, हालांकि आप तत्वों को छोड़ सकते हैं (ऊपर बताए गए अनुसार), आप अभी भी उसी क्रम में तत्वों पर तकनीकी रूप से पुनरावृत्ति कर रहे हैं।
सुनिश्चित नहीं है कि आप क्या हासिल करने की कोशिश कर रहे हैं, लेकिन आपकी कक्षा में IEnumerable
गुण हो सकते हैं, जिनमें से प्रत्येक एक विशिष्ट क्रम में तत्वों को दर्शाता है।
मैं कम से कम विस्मय के सिद्धांत का पालन करता हूं: http://en.wikipedia.org/wiki/Principle_of_least_astonishment – ChaosPandion
यदि आप पहले तत्व से प्रारंभ नहीं करते हैं, तो आप इटरेटर के व्यवहार को कैसे परिभाषित करते हैं? अनुक्रम के अंत तक पहुंचने पर क्या होता है? क्या यह पहले तत्व पर वापस जाता है और शेष तत्वों पर फिर से चला जाता है? –
@ कैओसपैंडियन की टिप्पणी वह जगह है जहां मैं उन प्रश्नों के साथ जा रहा था। :) –