2013-02-06 42 views
8
opencall.Priority = 
averages.Where(x => x.ProblemCode == opencall.ProblemCode) 
.SingleOrDefault().Priority; 

उपरोक्त लैम्ब्डा स्टेटमेंट कुछ नल देता है क्योंकि समस्या कोड हमेशा औसत सूची में होने की गारंटी नहीं देता है।सी # लैम्ब्डा कुछ शून्य मान देता है

मैं इस कथन को फिर से कैसे लिख सकता हूं ताकि अगर यह मामला ओपनकॉल हो। प्राथमिकता किसी त्रुटि को फेंकने के बजाय "" सेट हो गई है?

+0

यह लैम्ब्डा है कि रिक्त दिखाए, लेकिन Linq अभिव्यक्ति नहीं है। – Andrey

उत्तर

16

आपको null के अलावा, अपने संदर्भ प्रकार के लिए एक नया डिफ़ॉल्ट मान प्रदान करना होगा।

opencall.Priority = averages.Where(x => x.ProblemCode == opencall.ProblemCode) 
          .Select(x => x.Priority) 
          .DefaultIfEmpty("") 
          .Single(); 

तो Priority एक string है? ध्यान दें कि आपको SingleOrDefault की आवश्यकता नहीं है क्योंकि क्वेरी कभी अपवाद नहीं फेंक सकती है क्योंकि जब आप DefaultIfEmpty प्रदान करते हैं तो यह खाली होता है।

+0

धन्यवाद - "आप 5 मिनट में एक जवाब स्वीकार कर सकते हैं" ... – markp3rry

3

यह विभाजन अप:

var result = averages.Where(x => x.ProblemCode == opencall.ProblemCode).SingleOrDefault() 
opencall.Priority = result != null ? result.Priority : string.Empty; 
0

कोशिश हो रही समस्या कोड पहले, तो जाँच लें कि यह शून्य है।

var possiblyNullProblemCode= 
    averages.Where(
     x => x.ProblemCode == opencall.ProblemCode) 
     .SingleOrDefault(); 

openCall.Priority = 
    possiblyNullProblemCode == null ? 
     string.Empty : 
     possiblyNullProblemCode.Priority; 
0

मान लिया जाये कि प्राथमिकता स्ट्रिंग है, तो आप की कोशिश कर सकते:

var average = averages.Where(x => x.ProblemCode == opencall.ProblemCode).SingleOrDefault() 
opencall.Priority = average == null ? "" : average.Priority; 
+0

नल कोलेसिंग ऑपरेटर का उपयोग करके इसे पढ़ने में आसान बनाने का एक तरीका होना चाहिए। – Chris

0

आप बस लिख सकते हैं:

opencall.Priority = 
    averages.Where(x => x.ProblemCode == opencall.ProblemCode) 
    .Select(x => x.Priority) 
    .SingleOrDefault() ?? string.Empty;