2015-10-21 7 views
6

मैं इस परिदृश्य पर जब एक संग्रह समूहीकरण है:सी # IEnumerable.Count() फेंकता IndexOutOfRangeException

var result = data.GroupBy(x => x.Name.Split(new char[] { '-' })[1].Trim()); 

जहां डाटा वैरिएबल प्रकार ObservableCollection<Data>

की है जब मैं

if(result.Count()>0) 

के लिए जाँच यह इंडेक्सऑटऑफेंजेंज एक्सेप्शन

फेंकता है

बेशक ऐसा होता है क्योंकि स्ट्रिंग स्प्लिट ऑपरेशन अपवाद फेंकता है।

सवाल यह है: क्या समूह का नतीजा शून्य नहीं है और अपवाद से परहेज करने का कोई तरीका है?

+3

आप '-' द्वारा विभाजित हैं और इस सरणी को इंडेक्स 1 पर एक्सेस कर रहे हैं जो दूसरा आइटम है। जाहिर है कि कोई दूसरा आइटम नहीं है क्योंकि कोई '-' नहीं था। तो इसका 'शून्य' से कोई लेना देना नहीं है। –

+0

हां, मुझे पता है, समूह के अंदर सरणी की लंबाई को जांचने का कोई तरीका है? –

+0

resut.Any() चाल कर सकता है? –

उत्तर

10

सबसे पहले, Enumerable.Count सिर्फ टाल निष्पादित LINQ क्वेरी (GroupBy आस्थगित निष्पादन का उपयोग करता है, टिप्पणी अनुभाग देखें) निष्पादित करता है। तो Count यहां दोष नहीं है।

आप - द्वारा विभाजित कर रहे हैं और इस सरणी को इंडेक्स 1 पर एक्सेस कर रहे हैं जो दूसरा आइटम है। जाहिर है कि कोई दूसरा आइटम नहीं है क्योंकि - नहीं था। तो null के साथ इसका कोई लेना-देना नहीं है।

शायद यह केवल उन जहां एक दूसरे टोकन है लेने के लिए पर्याप्त है:

var result = data 
.Select(x => new{ Data = x, Split = x.Name.Split(new char[] { '-' }) }) 
.Where(x => x.Split.Length >= 2) 
.GroupBy(x => x.Split[1].Trim()); 

या दूसरे अगर वहाँ एक पीछे नहीं है, नहीं तो पहले:

var result = data 
.Select(x => new{ Data = x, Split = x.Name.Split(new char[] { '-' }) }) 
.GroupBy(x => x.Split.Length >= 2 ? x.Split[1].Trim() : x.Split[0].Trim()); 
+0

... या यहां तक ​​कि रिक्त समूह नाम (कुछ ऐसा) जैसे समूह var परिणाम = data.GroupBy (x => (x.Name! = शून्य और& x.Name.Contains ('-'))? x.Name.Split (नया char [] {'-'}) [1]। ट्रिम(): ""); –

+0

उत्कृष्ट उत्तर टिम, बहुत बहुत धन्यवाद –

2

आप क्या कर सकते हैं निम्नलिखित:

var result = data.GroupBy(x => x.Name.Contains('-') ? x.Name.Split('-')[1].Trim() : ""); 

आप पसंद नहीं है? ऑपरेटर या चाहते हैं कि उसे कम कॉम्पैक्ट, उपयोग:

var result = data.GroupBy(x => 
{ 
    string name = x.Name; 
    if (name.Contains('-')) return name.Split('-')[1].Trim(); 
    return ""; 
}); 

नोट: मैं Split(new char[] { '-' })

के बजाय Split('-') इस्तेमाल किया यह शायद टिम Schmelter के समाधान की तुलना में अधिक सहज ज्ञान युक्त है, लेकिन आप क्या चाहते हैं का उपयोग करें।

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