2013-10-08 4 views
12

के साथ इसके माध्यम से इटरेट करने के दौरान सूची में आइटम को हटाकर मेरे पास NeededList नाम की एक सूची है, मुझे यह देखने के लिए इस सूची में प्रत्येक आइटम को जांचना होगा कि यह मेरे डेटाबेस में मौजूद है या नहीं। यदि यह डेटाबेस में मौजूद है तो मुझे इसे सूची से निकालना होगा। लेकिन जब मैं इसके माध्यम से पुन: प्रयास कर रहा हूं, तो मैं सूची को बदल नहीं सकता। मै इसे काम मे कैसे ले सकता हूँ?प्रत्येक लूप

यहाँ मेरी कोड अब तक है:।

For Each Needed In NeededList 
     Dim Ticker = Needed.Split("-")(0).Trim() 
     Dim Year = Needed.Split("-")(1).Trim() 
     Dim Period = Needed.Split("-")(2).Trim() 
     Dim Table = Needed.Split("-")(3).Trim() 
     Dim dr As OleDbDataReader 
     Dim cmd2 As New OleDb.OleDbCommand("SELECT * FROM " & Table & " WHERE Ticker = ? AND [Year] = ? AND Period = ?", con) 
     cmd2.Parameters.AddWithValue("?", Ticker) 
     cmd2.Parameters.AddWithValue("?", Year) 
     cmd2.Parameters.AddWithValue("?", Period) 
     dr = cmd2.ExecuteReader 
     If dr.HasRows Then 
      NeededList.Remove(Needed) 
     End If 
Next 

उत्तर

27

नहीं, तुम ऐसा नहीं कर सकते कि प्रत्येक के लिए एक का उपयोग कर, लेकिन आप .. पाश के लिए पुराने जमाने का उपयोग कर ऐसा कर सकते हैं।
चाल अंत से शुरू और पीछे की ओर लूपिंग है। इस तरह, जब आप सूची से तत्वों को हटाते हैं, तो आप पहले तत्व की ओर बढ़ते हैं और आप कभी भी तत्वों को छोड़ते नहीं हैं क्योंकि वर्तमान वाला हटा दिया गया है और आपका अनुक्रमणिका बढ़ता जा रहा है।

For x = NeededList.Count - 1 to 0 Step -1 
    Dim Needed = NeededList(x) 
    ..... 
    If dr.HasRows Then 
     NeededList.RemoveAt(x) 
    End If 
Next 

इसके बजाय, यदि आप संग्रह के अंत में पाश और एक तत्व को निकालने का निर्णय, तो आप अगले एक को छोड़ दें। उदाहरण के लिए, मान लीजिए कि आप संग्रह में चौथे तत्व को हटाते हैं, उसके बाद, पांचवां तत्व चौथा हो जाता है। लेकिन अब सूचकांक 5 तक चला जाता है। इस तरह, पिछला पांचवां तत्व (अब चौथी स्थिति में) का मूल्यांकन कभी नहीं किया जाता है। बेशक आप इंडेक्सर के मान को बदलने की कोशिश कर सकते हैं लेकिन यह हमेशा खराब कोड और बग्स होने की प्रतीक्षा में समाप्त होता है।

+0

मैं इस विधि के साथ प्रत्येक आइटम को अलग कैसे विभाजित करूं? – gromit1

+1

आप अपने मूल कोड में किए गए 'आवश्यक' चर को विभाजित कर सकते हैं। – Steve

+0

जब मैं कोशिश करता हूं कि यह कहता है कि 'आवश्यकता' घोषित नहीं की गई है क्योंकि मैं इसे कोड की इस पंक्ति में घोषित कर रहा था 'प्रत्येक आवश्यक आवश्यकता के लिए' जिसे मैंने बदल दिया है। – gromit1

3

एक सरणी (या कुछ और की सामग्री को आप तेजी से For Each साथ गणना कर सकते हैं एक For Each पाश के साथ बदला नहीं जा सकता है आप एक सरल For पाश उपयोग करने की आवश्यकता और प्रत्येक इंडेक्स के माध्यम से पुनरावृत्त करें।

संकेत: क्योंकि आप इंडेक्स को हटा देंगे, मैं सुझाव देता हूं कि आखिरी इंडेक्स शुरू हो और पहले इंडेक्स की ओर अपना रास्ता काम करें ताकि आप हर बार एक को हटा सकें।

+0

मैं कैसे इस विधि के साथ अलग प्रत्येक आइटम विभाजित करने के लिए? – gromit1

4

आप स्टेप -1 के साथ प्रत्येक इंडेक्स के माध्यम से फ़ोर लूप का उपयोग कर सकते हैं।

For i as Integer = NeededList.Count - 1 to 0 Step -1 

    Dim Needed = NeededList(i) 

    'this is a copy of your code 
    Dim Ticker = Needed.Split("-")(0).Trim() 
    Dim Year = Needed.Split("-")(1).Trim() 
    Dim Period = Needed.Split("-")(2).Trim() 
    Dim Table = Needed.Split("-")(3).Trim() 

    Dim dr As OleDbDataReader 
    Dim cmd2 As New OleDb.OleDbCommand("SELECT * FROM " & Table & " WHERE Ticker = ? AND [Year] = ? AND Period = ?", con) 
    cmd2.Parameters.AddWithValue("?", Ticker) 
    cmd2.Parameters.AddWithValue("?", Year) 
    cmd2.Parameters.AddWithValue("?", Period) 
    dr = cmd2.ExecuteReader 

    'MODIFIED CODE 
    If dr.HasRows Then NeededList.RemoveAt(i) 

Next i 
+0

मैं इस विधि के साथ प्रत्येक आइटम को अलग कैसे विभाजित करूं? – gromit1

+1

उत्तर अद्यतन किया गया। आप बिना किसी समस्या के NeedList से हटा सकते हैं क्योंकि एक अलग फॉर लूप का उपयोग करके आप इसमें अंतिम तत्व से शुरू करते हैं। – tezzo

+0

मुझे यह त्रुटि मिली है "x" घोषित नहीं किया गया है। यह इसके सुरक्षा स्तर के कारण पहुंच योग्य नहीं हो सकता है। – gromit1

12

सुरक्षित के लिए जाओ और ToList() साथ एक प्रतिलिपि बनाने:

For Each Needed In NeededList.ToList() 
    Dim Ticker = Needed.Split("-")(0).Trim() 
    ... 
    If dr.HasRows Then 
     NeededList.Remove(Needed) 
    End If 
Next 
+1

यह एक अच्छा आसान समाधान है और पीछे की ओर पुनरावृत्ति की आवश्यकता नहीं है जो कि यदि आप फीफो ऑर्डर में प्रक्रिया करना चाहते हैं तो आसान नहीं है। मुझे पता है कि "बिल्ली को त्वचा" के कई तरीके हैं लेकिन यह मेरे लिए अच्छी तरह से काम करता है। – robnick

+0

जब तक मुझे अंत में आपका 'टॉलीस्ट' नहीं मिला, तब तक मैंने 'प्रत्येक' लूप को हटाने के साथ घंटों खो दिए हैं। इसे साझा करने के लिए धन्यवाद! – PeterCo

0

नहीं यदि आप एक सूची है कि आप जैसे पर काम कर रहे से नहीं निकाल सकते प्रत्येक Str स्ट्रिंग के रूप में के लिए listOfStrings तो Str.Equals ("पैट") फिर मंद सूचकांक = listOfStrings.IndexOf (STR) listOfStrings .RemoveAt (इंडेक्स) अंत तो अगला

लेकिन इस तरह से काम करेंगे में अपनी सूची की एक प्रति बनाएं और इससे हटाएं उदा प्रत्येक Str स्ट्रिंग के रूप में के लिए listOfStrings में तो Str.Equals ("पैट") फिर मंद सूचकांक = listOfStringsCopy.IndexOf (STR) listOfStringsCopy.RemoveAt (इंडेक्स) अंत तो अगला

0

तुम भी पलट सकते हैं सूची के तत्वों का क्रम और और Reverse एक्सटेंशन का उपयोग करके For Each का उपयोग करें।

सरल उदाहरण (स्ट्रिंग के) एक सूची का उपयोग कर:

For Each Needed In NeededList.Cast(Of List(Of String)).Reverse() 
    If dr.HasRows Then 
     NeededList.Remove(Needed) 
    End If 
Next 
0

यह कैसे (कोई यात्रा आवश्यक) के बारे में:

NeededList = (NeededList.Where(Function(Needed) IsNeeded(Needed)).ToList 

Function IsNeeded(Needed As ...) As Boolean 
    ... 
    Return Not dr.HasRows 
End Function 
संबंधित मुद्दे