2012-04-11 13 views
7

मैं कोशिश/पकड़ का उपयोग किए बिना कुछ स्थितियों के लिए एक चेक लिखने के लिए चाहता हूँ और मैं रेंज त्रुटियों के सूचकांक से बाहर हो रही हैरोकथाम रेंज त्रुटि के सूचकांक आउट

if (array.Element[0].Object.Length > 0 || array.Element[1].Object.Length > 0) //making sure there's at least one Object array that has values 
{     
    if (array.Element[0].Object[0].Item.Length != 0 || array.Element[1].Object[0].Item.Length != 0) //this is where I check that at least one of the Items (strings) is not empty 
     { 
      // execute code here 
     } 
} 

तो समस्या मैं की संभावनाओं से बचना चाहते हैं मुझे सामना करना पड़ रहा है कि दूसरे चेक में मुझे यह देखने की ज़रूरत है कि मेरे पास एक आइटम है जो खाली नहीं है। हालांकि, अगर मेरे पास Element[1] नहीं है, तो मुझे इंडेक्स आउट ऑफ़ रेंज अपवाद मिलता है। समस्या यह है कि 2 तत्व हो सकते हैं और उनमें से एक (या दोनों) खाली ऑब्जेक्ट सरणी हो सकती है। कोड केवल तभी निष्पादित किया जाना चाहिए जब एक आइटम आइटम स्ट्रिंग खाली न हो।

उम्मीद है कि, मैंने इसे अच्छी तरह से समझाया। मैं किसी भी शर्त के तहत उस अपवाद को प्राप्त करने से बचने के बारे में कैसे जा सकता हूं?

if(array.Element[0] != null || array.Element[1] != null){ 
    //execute code 
} 
+2

एक 'सूची ' के बजाय एक सरणी का उपयोग क्यों नहीं? –

+1

पहली पंक्ति में दो स्थितियां समान हैं - संभवतः यह जानबूझकर नहीं है? –

+0

मैं क्षमा चाहता हूं, दो अलग-अलग स्थितियां होनी चाहिए, मैंने इसे बदल दिया। – Victor

उत्तर

3

ठीक है, आपको कुछ बेहतर null checking और यहां कुछ और सावधानीपूर्वक कोड चाहिए।

if (array.Element[0].Object.Length > 0 || array.Element[1].Object.Length > 0) //making sure there's at least one Object array that has values 
{     
    if (array.Element[0].Object[0].Item.Length != 0 || array.Element[1].Object[0].Item.Length != 0) //this is where I check that at least one of the Items (strings) is not empty 
    { 
     // execute code here 
    } 
} 

बस अस्वीकार्य है।

सबसे पहले, चलो अशक्त जांच

if (array != null) 
{ 
    if (array.Element != null) 

सादगी के लिए, आप &&

if (array != null && array.Element != null) 

तो इस्तेमाल कर सकते हैं, कि अंदर है, तो हम पाश (since you're stuck on arrays) के लिए एक का उपयोग करें और शून्य यह जाँच

for (int i = 0; i < array.Element; ++i) 
{ 
    if (array.Element[i] != null && array.Element[i].Object != null) 
    { 

तब, क्योंकि आपके पास घोंसला घोंसला है, हम लूप फिर। इसे nested loop कहा जाता है, और यह आमतौर पर खराब अभ्यास है, मैं आपको दिखाऊंगा कि यह एक सेकंड में क्यों काम करता है।

for (int o = 0; o < array.Element[i].Object.length; ++o) 
{ 
    if (array.Element[i].Object[o] != null && !string.IsNullOrEmpty(array.Element[i].Object[o].Item)) 
    { 

अब, उस बदसूरत घोंसले वाली लूपनेस के साथ, हमने पाया है कि आपकी वस्तु शून्य नहीं है। उस के शीर्ष पर, आपके पास यहां सभी संभावित मानों तक पहुंच है, और आप उन्हें पसंद कर सकते हैं। यहां बताया गया है कि मैं सरलीकरण के लिए पूरी चीज़ को एक साथ कैसे रखूंगा।

List<string> arrayValues = new List<string>(); 
if (array != null && array.Element != null) 
{ 
    for (int i = 0; i < array.Element.length; ++i) 
    { 
     //bool found = false; 
     if (array.Element[i] != null && array.Element[i].Object != null) 
     { 
      for (int o = 0; o < array.Element[i].Object.length; ++o) 
      { 
       if (array.Element[i].Object[o] != null && !string.IsNullOrEmpty(array.Element[i].Object[o].Item)) 
       { 
        arrayValues.Add(array.Element[i].Object[o].Item); 
        //if you want to drop out here, you put a boolean in the bottom loop and break and then break out of the bottom loop if true 
        //found = true; 
        //break; 
       } 
      } 
     } 
     //if (found) 
     // break; 
    } 
} 
if (arrayValues.Count > 0) 
{ 
    //do stuff with arrayValues 
} 
+1

अच्छी तरह से किया गया! जब मुझे इस तरह के कोड की आवश्यकता होती है तो जब मैं सोचता हूं कि मेरा डिजाइन पहले स्थान पर उचित है या नहीं। मुझे संदेह है कि ओपी के डिजाइन को कुछ मौलिक परिवर्तनों से फायदा हो सकता है। –

0

आप की तरह कुछ कर सकता है।

मैं इसे इस तरह से काम कर सकते हैं मान:

var obj = array.Element.FirstOrDefault(x => x.Object.Length > 0); 
if (obj != null) 
{ 
    if (obj.Object[0].Item.Length != 0) 
    { 
    // do whatever is necessary 
    } 
} 
+0

मुझे लगता है कि अगर एलिमेंट [1] 'मौजूद नहीं है तो यह अभी भी अपवाद प्राप्त करेगा। – Victor

+0

आह, मुझे विश्वास है कि आप सही हैं। – Ryan

0

आपका कोड शायद refactor के अधीन है:

1

प्लेस दोनों परीक्षणों एक साथ शॉर्ट सर्किट && का उपयोग कर सकते हैं कि यदि पहले विफल रहता है दूसरे टेस्ट नहीं होती है:

object element0 = array.Element[0].Object; 
object element1 = array.Element[1].Object; 

// Ensure at least one Object array has a non-empty value. 
if ((element0.Length > 0 && !string.IsNullOrEmpty((string)element0.Object[0].Item)) 
    || (element1.Length > 0 && !string.IsNullOrEmpty((string)element1.Object[1].Item))) 
{ 
    // ... 
} 

मुझे लगता है कि यह अपवाद का कारण बन रहा है - आप उस पर स्पष्ट नहीं थे। यदि यह Element[1] कि अपवाद (या दोनों) का कारण बनता है, तो आप सरणी की लंबाई पूर्व परीक्षण की आवश्यकता:

if ((array.Element[0].Length != 0 && HasValue(array.Element[0].Object)) 
    || (array.Element[1].Length > 1 && HasValue(array.Element[1].Object))) 
{ 
    // ... 
} 

// <summary> 
// Returns true if the specified string array contains a non-empty value at 
// the specified index. 
// </summary> 
private bool HasValue(System.Array array, int index) 
{ 
    return array.Length > index && 
     !string.IsNullOrEmpty((string)array.Object[index].Item); 
} 
0

मुझे लगता है कि इससे पहले कि आप अपने पहले यदि चेक सही में अपना चेक डाल सकते हैं।

if (array.Length > 1 && array.Element[0].Object.Length > 0 || array.Element[1].Object.Length > 0) //making sure there's at least one Object array that has values 
{     
    if (array.Element[0].Object[0].Item.Length != 0 || array.Element[1].Object[0].Item.Length != 0) //this is where I check that at least one of the Items (strings) is not empty 
     { 
      // execute code here 
     } 
} 

यदि आपके सरणी में दोनों तत्व नहीं हैं तो यह केवल शॉर्ट-सर्किट होना चाहिए।

0
for (long i = 0; i <= (output3.Length); i++) 
{ 
    output1.WriteByte(output3[i]); -----> index out of range exception correct it 
    output1.WriteByte(output3rx[i]); 
} 
+1

"श्रेणी अपवाद से बाहर सूचकांक इसे सही करें"। एर, वह ऐसा करने के लिए _how_ पूछ रहा था। –

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