2016-01-22 9 views
5

जब मैं String.Split का उपयोग यादृच्छिक तारों के साथ कर रहा हूं तो मुझे इस अपवाद का सामना करना पड़ रहा है।एक LINQ में System.IndexOutOfRangeException को कैसे रोकें?

List<string> linhas = new List<string>(); 

linhas.Add("123;abc"); 
linhas.Add("456;def"); 
linhas.Add("789;ghi"); 
linhas.Add("chocolate"); 

var novas = linhas.Where(l => l.ToString().Split(';')[1]=="def"); 
+1

नोट करें कि आपको वहां 'ToString' की आवश्यकता नहीं है। – juharr

+0

आपको सूची में अंतिम itme की वजह से अपवाद मिलता है जिसमें ';' ('linhas.Add (" चॉकलेट ") नहीं है;') – Rahul

+1

इस प्रश्न का LINQ से कोई लेना देना नहीं है। इस मुद्दे की जांच करने के लिए आपने पहले से क्या किया? शुरू करने के लिए: 'चॉकलेट "निष्पादित करें। स्प्लिट ('; ') [1]'। – usr

उत्तर

12

अंतिम स्ट्रिंग "chocolate" एक ";" शामिल नहीं है, इसलिए String.Split एक एकल स्ट्रिंग "chocolate" साथ एक सरणी देता है। यही कारण है कि यदि आप दूसरे तक पहुंचने का प्रयास करते हैं तो आपको अपवाद मिलता है।

आप ElementAtOrDefault जो बजाय स्ट्रिंग्स के लिए null रिटर्न इस्तेमाल कर सकते हैं:

var novas = linhas.Where(l => l.Split(';').ElementAtOrDefault(1) == "def"); 

एक लंबे समय तक दृष्टिकोण एक गुमनाम प्रकार का उपयोग:

var novas = linhas 
    .Select(l => new { Line = l, Split = l.Split(';') }) 
    .Where(x => x.Split.Length >= 2 && x.Split[1] == "def") 
    .Select(x => x.Line); 
+2

जबकि यह "काम" करेगा (काम की कुछ परिभाषा के लिए) मुझे लगता है कि बैठने से बहुत कुछ जीता जाएगा एक मिनट के लिए नीचे, इस बारे में सोचकर कि सूची में ऐसी चीजें क्यों हैं जिनकी हमें आवश्यकता नहीं है। क्या यह सूची में एक समस्या है? क्या यह टुपल्स/केवीपीयर का गुच्छा होना चाहिए? क्या हमें इनपुट को स्वच्छ करना चाहिए? आदि। मुझे लगता है कि यह एक ऐसा मामला है जहां केवल "इसे काम करने के लिए" हैकी है और बाद में इसी तरह की समस्याओं का कारण बन जाएगा। व्यवसाय की आवश्यकता की पहचान करें और इसे समाहित करने के लिए एक बेहतर तरीका खोजें। – kai

+3

@kai: मुझे बिल्कुल पता नहीं है कि ओपी को इसकी क्या ज़रूरत है। तो मैं इस बारे में धारणा नहीं कर सकता कि यह एक अच्छा दृष्टिकोण है या नहीं। हम बहुत कम जानते हैं और ओपी का नमूना भी समझा जा सकता है। –

+2

आपको यह मानने की आवश्यकता नहीं है कि ओप बिल्कुल सबसे अनुभवी डेवलपर नहीं है और शायद यहां एक एक्स/वाई समस्या है:/ – Will

1

मैं टिम का जवाब और इस शो पर एक छोटे से विस्तार करने के लिए जा रहा हूँ आपके LINQ प्रश्नों के भीतर कुछ अतिरिक्त चीजें करने का एक तरीका।

आप कुछ अतिरिक्त प्रक्रियाओं को करने के लिए Where खंड के भीतर तर्क का विस्तार कर सकते हैं, जो आपके कोड को थोड़ा अधिक पठनीय बना सकता है। यह कुछ छोटे के लिए अच्छा होगा:

var novas = linhas.Where(l => 
      { 
       var parts = l.Split(':'); 

       return parts.Length > 1 ? parts[1] == "def" : false; 
      }); 

आप एक से अधिक बयान की जरूरत है, तो आप घुंघराले ब्रेसिज़ के भीतर अपने खंड के शरीर में लपेट कर सकते हैं, लेकिन फिर आप return कीवर्ड की जरूरत है।

वैकल्पिक रूप से, यदि आपके पास बहुत सारी जानकारी है जो उस अपठनीय की तरह कुछ इनलाइन बनाती है, तो आप अपनी क्वेरी के भीतर एक अलग विधि का भी उपयोग कर सकते हैं।

public void FindTheStringImLookingFor() 
{ 
    var linhas = new List<string>(); 

    linhas.Add("123;abc"); 
    linhas.Add("456;def"); 
    linhas.Add("789;ghi"); 
    linhas.Add("chocolate"); 

    var words = linhas.Where(GetTheStringIWant); 
} 

private bool GetTheStringIWant(string s) 
{ 
    var parts = s.Split(':'); 

    // Do a lot of other operations that take a few lines. 

    return parts.Length > 1 ? parts[1] == "def" : false; 
} 
संबंधित मुद्दे