2011-10-06 9 views
5

मैं इस माध्यम से विश्लेषण करने के लिए एक तत्व मौजूद है या नहीं, इसके माध्यम से चलाने के लिए प्रयास/पकड़ विवरण का उपयोग कर रहा हूं। जाहिर है यह करने का सबसे अच्छा तरीका नहीं है। मैं अपने पार्सिंग के बहुमत के लिए LINQ (लैम्ब्डा एक्सप्रेशन) का उपयोग कर रहा हूं, लेकिन मुझे नहीं पता कि कोई तत्व कहां है या नहीं।सी # में लैम्ब्डा अभिव्यक्ति का उपयोग कर तत्व मौजूद है या नहीं?

मुझे मिले कुछ समाधानों के साथ एक बड़ी समस्या यह है कि वे कोशिश/पकड़ ब्लॉक का उपयोग करने से 3-4 गुना अधिक कोड लेते हैं, जो इस उद्देश्य को हरा देता है।

मैं कोड कुछ इस तरह दिखेगा ग्रहण करेंगे:

if(document.Element("myElement").Exists()) 
{ 
    var myValue = document.Element("myElement").Value; 
} 

मैं इस link मिला, लेकिन पाशन मेरे मामले में अनावश्यक है के रूप में मैं गारंटी ले सकते हैं कि यह केवल एक बार दिखाई देगा यदि वह मौजूद है । इसके अलावा एक डमी तत्व बनाने का तथ्य जो अनावश्यक लगता है। ऐसा लगता है कि यह जांच का सबसे अच्छा तरीका (या एक अच्छा तरीका) नहीं है। कोई विचार?

+0

ए 'try'/'catch' ब्लॉक बहुत धीमा हो सकता है। उन्हें जितना संभव हो से बचा जाना चाहिए। – Enigmativity

उत्तर

4
XElement e = document.Element("myElement"); 
if (e != null) 
{ 
    var myValue = e.Value; 
} 

http://msdn.microsoft.com/en-us/library/system.xml.linq.xcontainer.element.aspx

"पहले (दस्तावेज़ क्रम में) बच्चे निर्दिष्ट XName साथ तत्व हो जाता है।"

"निर्दिष्ट नाम के साथ कोई तत्व नहीं होने पर कुछ भी वापस नहीं आता है।"

0

कोई भी() लिंक कमांड है।

Assert.IsFalse(new [] { 1, 2, 3, 4 }.Any(i => i == 5)); 
-1

Any() एक तत्व मौजूद है, तो जाँच करने के लिए सबसे आसान तरीका है।

यदि आपको यह सुनिश्चित करना है कि तत्व अद्वितीय है, तो आपको .Count() == 1 जैसे कुछ करना होगा। वैकल्पिक रूप से आप अपनी खुद की विस्तार विधि को कार्यान्वित कर सकते हैं, लेकिन यह .Count == 1 के आसपास केवल एक रैपर होगा।

0

बीटीडब्ल्यू, "कोशिश/पकड़" के बारे में उपरोक्त टिप्पणी सच हो सकती है, लेकिन लगभग सभी मामलों में नहीं है। यह इस बात पर निर्भर करता है कि आप अपना समाधान कैसे बनाते हैं। अपने रिलीज बिल्ड में, जितना संभव हो उतना झंडे बंद करें जो दूरी से भी "डीबग" की तरह गंध करता है। रनटाइम को बिल्डिंग के दौरान स्टैक निशान और सामान को याद रखने के लिए कहा गया है, तेज़ "कोशिश/पकड़" बन जाता है।

बीटीडब्ल्यू, # 2: प्रसिद्ध वास्तुशिल्प पैटर्न "बताओ, मत पूछो!" (टीडीए) और "ओपन क्लोज़ सिद्धांत" (ओसीपी) को इस तरह के कुख्यात कोड जैसे "if (! (Fp = fopen (...))" का उपयोग करने से मना कर दिया गया है। वे आपको "उपयोग करने के लिए प्रोत्साहित नहीं करते हैं"/पकड़ो "लेकिन आपको ऐसा करने के लिए मजबूर करता है। क्योंकि ओसीपी न केवल आपके कोड के भीतर पालन करने की मांग करता है बल्कि विदेशी सामान (यानी स्टेडियो जैसे पुस्तकालय) को कॉल करते समय भी।

ओसीपी क्यों अंतिम वाक्य में टीडीए नहीं? आपको मौजूदा कोड के अर्थ को विस्तृत करने की अनुमति नहीं है। सरल "फॉपेन" उदाहरण पर चिपके हुए, परिणाम शून्य होने पर आप क्या करने जा रहे हैं? वास्तव में "फॉपेन" क्यों विफल हुआ? आप गीलेर की जांच कर सकते हैं कि वहां पर्याप्त रिक्त स्थान है बाएं, या यदि फ़ाइल सिस्टम लिखने योग्य है। यदि फ़ाइल का नाम मान्य है या नहीं। फिर भी, आपका लक्ष्य हासिल नहीं किया जा सकता है: फ़ाइल खोलें। एक हेडलेस एप्लिकेशन की कल्पना करें, इसलिए उपयोगकर्ता का कोई हस्तक्षेप संभव नहीं है। अब क्या? क्या आप वहां मौजूद हैं सामान के साथ आगे बढ़ने का कोई कारण नहीं है, क्योंकि "फॉपेन" असफल रहा। आपको फ़ॉलबैक रणनीति की आवश्यकता होगी। डॉट। अगर "फॉपेन" विफल हो गया है, तो यह असफल रहा है।

अंगूठे का नियम: हमेशा के रूप में अपने कोड के बारे में सोचें (केआईएस)।यदि आपका कोड स्वेच्छा से 'असफल' हो सकता है, तो परिणामस्वरूप नियमित रूप से तत्व हो सकते हैं या नहीं, तर्क को कक्षा में डाल दें। शायद आपको विभिन्न वर्गों (टीडीए) में डेटा, गुण, और प्रश्न, और विधियों को वितरित करना होगा। शायद आपको एसएलए के अनुसार अपना कोड समायोजित करना होगा।

आपके मामले में, हालांकि, सुनिश्चित करें कि तत्व मौजूद है। यदि आप नहीं कर सकते हैं, तो यह आपकी गलती नहीं है। अपने कोड में गहराई से डालें (एक रैपर जहां पूर्व कोडर की सभी गलतियों को सुशोभित किया जाता है), किसी अन्य इकाई में आवश्यक डेटा को बदल दें, जैसे आगे "अगर" की आवश्यकता नहीं है।

+0

कोड जो शून्य देता है वह कोड सफल होता है। यह जांचना कि क्या आपके अपने दायरे में कोई मूल्य शून्य है, टीडीए या ओसीपी का उल्लंघन करने के साथ कुछ लेना देना नहीं है। –

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