2008-10-15 13 views
7

मैं एक सूची संग्रह लूप करने के लिए निम्न सिंटैक्स का उपयोग कर रहा:मैं किसी ऑब्जेक्ट की अनुक्रमणिका प्रत्येक के लिए कैसे प्राप्त करूं ... अगला लूप?

For Each PropertyActor As JCPropertyActor In MyProperty.PropertyActors 

    i = IndexOf(PropertyActor) 
Next 

मैं पाश के भीतर मौजूदा वस्तु का सूचकांक कैसे मिलता है? मैं इंडेक्सऑफ (प्रॉपर्टीएक्टर) का उपयोग कर रहा हूं लेकिन यह अक्षम लगता है क्योंकि यह संग्रह की खोज करता है जब मेरे पास पहले से ऑब्जेक्ट उपलब्ध है!

उत्तर

12

एक सूचकांक कोई अर्थ नहीं है एक आईनेमरेबल के लिए, जो फोरैच निर्माण का उपयोग करता है। यह महत्वपूर्ण है क्योंकि foreach इंडेक्स ऑर्डर में गणना नहीं कर सकता है, यदि आपका विशेष संग्रह प्रकार एक अजीब तरीके से IENumerable लागू करता है। आप एक वस्तु है कि एक यात्रा के दौरान सूचकांक में और आप सूचकांक के बारे में परवाह द्वारा पहुँचा जा सकता है, तो आप सिर्फ पाश के लिए एक पारंपरिक का उपयोग कर बेहतर कर रहे हैं:

for (int i=0;i<MyProperty.PropertyActors.Length;i++) 
{ 
    //... 
} 
2

बस पाश प्रवेश करने से पहले एक पूर्णांक चर को प्रारंभ और यह पुनरावृति ...

Dim i as Integer 
For Each PropertyActor As JCPropertyActor In MyProperty.PropertyActors 
    i++ 
Next 
+0

जैसा कि जोएल ने निहित किया, फॉर प्रत्येक ब्लॉक आईनेमेरेबल इंटरफ़ेस का उपयोग करता है जो आवश्यक रूप से इंडेक्स के समान क्रम का उपयोग नहीं करता है। –

+0

मुझे अभी भी विश्वास है कि 'i' वैरिएबल आपको सही उत्तर देगा ... – sebagomez

1

एक सूचकांक चर कि आप अपने आप प्रत्येक यात्रा के लिए वृद्धि जोड़ें

+0

हाँ, जैसा कि मैंने कोड में किया था, मैंने – sebagomez

12

AFAIK चूंकि यह ऑब्जेक्ट संग्रह से बाहर खींचता है, तो आपको इसे खोजने के लिए संग्रह पर वापस जाना होगा।

यदि आपको प्रत्येक लूप के लिए उपयोग करने के बजाय इंडेक्स की आवश्यकता है, तो मैं सिर्फ एक लूप का उपयोग करता हूं जो सूचकांक के माध्यम से चला जाता है ताकि आप जान सकें कि आपके पास क्या है।

+1

पोस्ट किया था, इस दृष्टिकोण को समान कमी होगी, क्योंकि संग्रह हैशलिस्ट हैं, और इंडेक्स द्वारा एक्सेस करना है इंडेक्स का उपयोग करने के रूप में बुरा है। एक अलग काउंटर का उपयोग करें, आप उस पूर्णांक को बर्दाश्त कर सकते हैं। – tabdamage

+0

यह हो सकता है, लेकिन व्यक्तिगत रूप से यदि आपको इंडेक्स की आवश्यकता है, तो लूप के लिए अधिक व्यावहारिक अर्थ है, और ऐसा कुछ नहीं है जो जगह से बाहर निकलने जा रहा है। –

6

यह हो सकता है सबसे आसान होना सिर्फ एक अलग काउंटर रखने के लिए:

i = 0 
For Each PropertyActor As JCPropertyActor In MyProperty.PropertyActors 
    ... 
    i = i + 1 
Next 

एक अलग रूप में के रूप में, अजगर ऐसा करने का एक सुविधाजनक तरीका है:

for i, x in enumerate(a): 
    print "object at index ", i, " is ", x 
+0

मुझे समझ में नहीं आ रहा है कि मैंने जो लिखा है उससे इतना अलग क्यों है ... आपको +2 मिल गया है और मुझे मिला है -2 :( – sebagomez

+0

आपके द्वारा बनाए/बनाए रखने वाली अनुक्रमणिका आवश्यक रूप से संग्रह के समान सूचकांक नहीं होगी (क्योंकि foreach सूचकांक क्रम में जरूरी नहीं है)। यह अन्य, समान, गलत उत्तरों के साथ भी रेट किया जाएगा। –

+0

ब्रेमेन: मैं उस आश्चर्यजनक परिणाम (और अच्छे तरीके से नहीं) पर विचार करूंगा। कोई आश्चर्य नहीं कि मैं ' वास्तव में वीबी में कोड नहीं है। –

1

आप "FindIndex" इस्तेमाल कर सकते हैं तरीका।

MyProperty.PropertyActors.FindIndex(Function(propActor As JCPropertyActor) propActor = JCPropertyActor) 

लेकिन हर पाश कि अतिरिक्त भूमि के ऊपर की बहुत की तरह लगता है, और "indexOf" विधि के रूप में ही है, जिसके परिणामस्वरूप समस्या की तरह लगता है के लिए एक के अंदर। मैं पुराने फैशन सूचकांक पुनरावृत्ति का उपयोग करने का सुझाव देते हैं। इस तरह आपके पास आपकी अनुक्रमणिका और आपकी वस्तु है।

Dim PropertyActor As JCPropertyActor 
For i As Integer = 0 To MyProperty.PropertyActors.Count - 1 
    PropertyActor = MyProperty.PropertyActors.Item(i) 
Next 
संबंधित मुद्दे