2012-01-26 17 views
5

को संग्रहीत करने का स्वच्छ कार्यान्वयन मुझे foreach लूप के भीतर से वर्तमान पंक्ति सूचकांक को जानने की आवश्यकता है।वर्तमान पंक्ति सूचकांक

foreach (DataRow row in DataTable[0].Rows) 
{ 
    // I do stuff in here with the row, and if it throws an exception 
    // I need to pass out the row Index value to the catch statement 
} 

एक अपवाद try/catch ब्लॉक के किसी भी समय हो सकता है, लेकिन अगर मैं foreach पाश के भीतर एक वृद्धिशील काउंटर का उपयोग करें, और लूप के बाहर अपवाद तब होता है, मैं गलत पंक्ति क्योंकि मैं मिल जाएगा एक पॉइंटर को एक साथ ले जाया गया है।

मुझे पता है कि मैं foreach गुंजाइश की एक DataRow बाहर घोषणा कर सकते हैं, लेकिन foreach एक try/catch ब्लॉक के भीतर है। मुझे पंक्ति सूचकांक पारित करने की आवश्यकता है ताकि मैं इसे catch कथन में उपयोग कर सकूं। मुझे कहना चाहिए कि मेरा DataTable कक्षा स्तर के दायरे में है।

क्या यह वास्तव में वर्तमान पंक्ति सूचकांक प्राप्त करने का एकमात्र तरीका है? या क्या एक क्लीनर कार्यान्वयन है?

संपादित

तो, यह करने के लिए अधिक सोचा दे, मैं एक int तो जैसे वर्तमान पंक्ति मूल्य इस मूल्य की दुकान, और बढ़ाने के लिए इस्तेमाल कर सकते हैं:

int i = 0; 

try 
{ 
    // Some code here - which could throw an exception 
    foreach (DataRow row in DataTables[0].Rows) 
    { 
     // My stuff 
     i++; 
    } 
    // Some code here - which could throw an exception 
} 
catch 
{ 
    // Use the counter 
    DataRow row = DataTables[0].Rows[i]; 
} 

हालांकि, अगर foreach अपवाद फेंक नहीं देता है, तो i का मान तालिका में पंक्तियों की वास्तविक संख्या से अधिक होगा। जाहिर है, foreach लूप के बाद मैं i--; कर सकता था, लेकिन यह वास्तव में गंदे हैक जैसा लगता है।

+1

'try' के बाहर एक काउंटर वैरिएबल घोषित करें और प्रत्येक लूप पुनरावृत्ति के लिए वृद्धि। – Oded

+0

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

+0

कभी-कभी एक सादा() लूप प्रत्येक के लिए बेहतर काम करता है। यह उन मामलों में से एक है। –

उत्तर

0

एक गंदा रास्ता एक अतिरिक्त trycatch ब्लॉक में यह whrap है कि अपवाद फेंक दिया गया है या इसे ठीक करने के लिए सही है, और आप हमेशा सही इटरेटर प्राप्त करते हैं।

+0

मैं इस के लिए एक समान समाधान कर समाप्त हो गया। –

+0

@NeilKnight अच्छी तरह से, वह गंदे है, लेकिन फिर फिर इस अपवाद पर आपका पूरा नियंत्रण है। बीटीडब्लू, अब जब मैं इसके बारे में सोचता हूं, यदि आप अपवादों के प्रकार को अलग करते हैं, तो आप एकाधिक पकड़ ब्लॉक का उपयोग कर सकते हैं। मेरा मतलब है, अगर आपका foreach स्टेटमेंट केवल NullRefferenceException उत्पन्न करता है, तो आप इसे अलग से पकड़ सकते हैं और "i" चर को कम कर सकते हैं। वह थोड़ा क्लीनर समाधान होगा। – Igarioshka

+0

जो मैंने अपने कोड में किया है: ओ) –

0

हर पाश यात्रा के लिए कोशिश और वेतन वृद्धि के बाहर एक काउंटर चर घोषित करें:

int i = 0; 
try 
{ 
    // Some code here - which could throw an exception 

    try{ 
     foreach (DataRow row in DataTables[0].Rows) 
     { 
      // My stuff 
      i++; 
     } 
     // Some code here - which could throw an exception 
    } 
    catch{ 
     i--; 
     throw; 
    } 

} 
catch 
{ 
    // Use the counter 
    DataRow row = DataTables[0].Rows[i]; 
} 

कि जिस तरह से आप निश्चित रूप से पता है:

+0

असल में, इससे मदद नहीं मिलेगी क्योंकि अगर कोई अपवाद होता है 'foreach' तो मेरे पास गलत पंक्ति संख्या है। –

+0

@NeilKnight - इस मामले का आपका विवरण सही नहीं है। आप वास्तव में कहते हैं कि अपवाद' foreach' (टिप्पणी ब्लॉक में) के भीतर फेंक दिया गया है। – Oded

+0

मैं वास्तव में कहें कि "अगर यह अपवाद फेंकता है", 'प्रयास/पकड़' ब्लॉक के भीतर कहीं भी अपवाद हो सकता है। –

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