2010-01-18 10 views
8

यह देखने के लिए कि क्या यह खाली है, मैं जेनेरिक डिक्शनरी ऑब्जेक्ट का परीक्षण कैसे करूं? मैं इस प्रकार के रूप में कुछ कोड चलाना चाहते हैं:खाली generic.dictionary संग्रह के लिए परीक्षण कैसे करें?

while (reportGraphs.MoveNext()) 
{ 
    reportGraph = (ReportGraph)reportGraphs.Current.Value; 
    report.ContainsGraphs = true; 
    break; 
} 

reportGraph ऑब्जेक्ट प्रकार की है System.Collections.Generic.Dictionary इस कोड चल रहा है तो reportGraphs शब्दकोश खाली है और MoveNext() तुरंत एक NullReferenceException फेंकता है। यदि खाली संग्रह को संभालने का एक और अधिक प्रभावी तरीका है तो मैं ब्लॉक के चारों ओर एक कोशिश-पकड़ नहीं रखना चाहता हूं।

धन्यवाद।

+2

क्या आप सुनिश्चित हैं कि 'रिपोर्टग्राफ' स्वयं 'शून्य' नहीं है? – dtb

+2

'System.Collections.Generic.Dictionary' * * MoveNext()' विधि नहीं है। क्या आप वाकई एक शब्दकोश पर एक पुनरावर्तक के बारे में सोच नहीं रहे हैं? –

+0

बहुत खेद है, रिपोर्टग्राफ वास्तव में रिपोर्टग्राफ = नई प्रणाली के रूप में परिभाषित किया गया है। नई प्रणाली। चयन। Generic.Dictionary .numerator(); तो, EnNator पर लागू होने पर MoveNext() का पता लगाने का कोई भी तरीका अपवाद फेंक देगा। अगर मैं शून्य के लिए जांच करने की कोशिश करता हूं तो मुझे ऑपरेटर '!' 'के प्रकार के सिस्टम पर लागू नहीं किया जा सकता है' System.Collections.Generic.Dictionary Enumerator 'और' ' – DEH

उत्तर

12

यदि यह एक सामान्य शब्दकोश है, तो आप केवल Dictionary.Count देख सकते हैं। अगर यह खाली है तो गणना 0 होगी।

हालांकि, आपके मामले में, reportGraphs ऐसा लगता है कि यह IEnumerator<T> है - क्या आपके द्वारा हाथ से आपके संग्रह की गणना करने का कोई कारण है?

+0

आप सही हैं - यह वास्तव में एक गणक है - क्षमा करें। कोई मजबूत कारण नहीं है, ऐप के भीतर ऑब्जेक्ट मॉडल को संरचित किया गया है - इसे बदलने के लिए इसे काफी काम की आवश्यकता होगी ... – DEH

+1

यह आमतौर पर आईएन्यूमेरेटर के साथ काम न करने के लिए एक बेहतर तरीका है - इसके बजाय फ़ोरैच लूप का उपयोग करें , क्योंकि यह आम तौर पर इस सटीक परिदृश्य को रोक देगा ... –

6

empty शब्दकोश और null के बीच एक अंतर है। खाली संग्रह पर MoveNext पर कॉल करने से परिणामस्वरूप NullReferenceException नहीं होगा। मुझे लगता है कि आपके मामले में आप reportGraphs != null पर परीक्षण कर सकते हैं।

+0

रिपोर्टग्राफ अधिक दिखता है हालांकि एक शब्दकोश की तुलना में एक गणक। एक शब्दकोश को 'शून्य' गणनाकर्ता क्यों वापस करना चाहिए? बस सोच रहा है ... – dtb

+0

@ डीटीबी अच्छा बिंदु। यह एक 'IENumerable 'होना चाहिए। –

+0

लेकिन 'शब्दकोश 'लागू' आईन्यूमेरेबल > ', है ना? मुझे विश्वास है कि यह 'मूल्य' संपत्ति से आता है। – Groo

3

जैसा कि डारिन ने कहा, reportGraphsnull है यदि यह NullReferenceException फेंकता है। सबसे अच्छा तरीका यह सुनिश्चित करना होगा कि यह कभी भी शून्य न हो (यानी सुनिश्चित करें कि यह आपके वर्ग के निर्माता में प्रारंभ हुआ है)। इस उदाहरण भी मानती है कि कि reportGraphs कभी नहीं null है

foreach (KeyValuePair<Key,Value> item in reportGraphs) 
{ 
    // do something 
} 

[संपादित करें] नोट:

एक और तरीका है यह करने के लिए (स्पष्ट रूप से गणना से बचने के लिए) एक foreach कथन का उपयोग करने के लिए किया जाएगा।

+0

अगर रिपोर्टग्राफ शून्य है तो यह NullReferenceException को फेंक देगा। –

+0

सही, * यह सुनिश्चित करना सबसे अच्छा तरीका होगा कि यह कभी शून्य नहीं है *। – Groo

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