2012-11-21 12 views
18

मेरे पास कुछ IEnumberable आइटम संग्रह हैं। मैं संग्रह में एक विशिष्ट वस्तु खोजने के लिए .Single() का उपयोग करता हूं।LINQ सिंगल() 0 या एकाधिक वस्तुओं के लिए अपवाद

मैं Single() का उपयोग करना चुनता हूं क्योंकि केवल एक विशिष्ट आइटम होना चाहिए। हालांकि, अगर कोई अस्तित्व में नहीं है, तो मुझे इसे बनाने और संग्रह में जोड़ने की आवश्यकता है।

मेरी समस्या यह है कि Single() एक ही त्रुटि को फेंकता है यदि कोई आइटम भविष्यवाणी से मेल नहीं खाता है या यदि कई आइटम हैं। मेरा विचार Single() को कोशिश करने और अपवाद को पकड़ने के अंदर कॉल करना था, आइटम जोड़ें, और फिर जारी रखें। हालांकि, चूंकि दोनों परिदृश्य InvalidOperationException फेंकते हैं, तो मैं कैसे बता सकता हूं कि इसकी कोई वस्तु या एकाधिक आइटम नहीं हैं?

मुझे पता है कि मैं First() का उपयोग कर सकता हूं लेकिन यह इस विचार को लागू नहीं करता है कि केवल एक होना चाहिए (अतिरिक्त काम किए बिना)।

मैं भी Single() कॉल करने से पहले Count() इस्तेमाल कर सकते हैं, लेकिन यह सिर्फ Single()

उत्तर

32

की बात को कमजोर करने के तुम क्या चाहते है लगता है SingleOrDefault()

"या डिफ़ॉल्ट" वास्तव में यह शून्य देता है (संदर्भ के लिए इसका मतलब है प्रकार) या जो भी गैर-संदर्भ प्रकार के लिए डिफ़ॉल्ट होगा। आपको अपनी जगह लेने के लिए किसी ऑब्जेक्ट को नए-अप करने की आवश्यकता होगी।

+5

ठीक है, यह तत्व प्रकार के लिए डिफ़ॉल्ट मान देता है। यह संदर्भ प्रकारों के लिए शून्य है, लेकिन स्पष्ट रूप से गैर-शून्य मूल्य प्रकारों के लिए नहीं ... –

+1

... और यदि आप चेन नल चेक करना चाहते हैं, तो इस तरह के कुछ http://napoleonss.wordpress.com/2011/12/ का उपयोग कर सकते हैं 20/मेरी-चेक-अशक्त /। – napoleonss

+0

@JonSkeet पर डिफ़ॉल्ट के लिए काम करता है आप सही हैं। मुझे लगता है कि वह एक संदर्भ प्रकार के बारे में बात कर रहा था हालांकि। –

4

मैं इस परिदृश्य में प्रयास/पकड़ का उपयोग करने की अनुशंसा नहीं करता, क्योंकि तार्किक निर्णय लेने के अपवादों का उपयोग संसाधन महंगा है।

मैं SingleOrDefault() का उपयोग करने की सलाह दूंगा, और जांच करूँगा कि परिणाम शून्य है या नहीं। अगर यह होता है। अपनी रचना करो

+4

"संसाधन महंगा" - कुछ हद तक एक पुरानी/गलत दृश्य है। यहां उपलब्ध रिको मारियानी लिंक देखें। http://stackoverflow.com/q/891217/16391। मैं सहमत हूं कि तार्किक निर्णय लेने के लिए अपवादों का उपयोग करना एक खराब डिजाइन विकल्प है। – StingyJack

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