को संग्रहीत करने का स्वच्छ कार्यान्वयन मुझे 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--;
कर सकता था, लेकिन यह वास्तव में गंदे हैक जैसा लगता है।
'try' के बाहर एक काउंटर वैरिएबल घोषित करें और प्रत्येक लूप पुनरावृत्ति के लिए वृद्धि। – Oded
मैं ऐसा करने से बचने की कोशिश कर रहा था, बस वहां एक फैंसी इंडेक्सर था जिसका उपयोग किया जा सकता था। हालांकि यह शायद मेरा एकमात्र समाधान है। : ओ ( –
कभी-कभी एक सादा() लूप प्रत्येक के लिए बेहतर काम करता है। यह उन मामलों में से एक है। –