2011-06-22 20 views
9

मैं निम्नलिखित कोड है:लैम्ब्डा बनाम LINQ- "अभिव्यक्ति हमेशा गलत है"

var thing = (from t in things 
      where t.Type == 1 && t.IsActive 
      select t).SingleOrDefault(); 

if (thing == null) 
{ 
    // throw exception 
} 

things इकाई की रूपरेखा स्व ट्रैकिंग संस्थाओं

यह अच्छी तरह से काम करता है का एक संग्रह है, फिर भी मैं उपयोग करना चाहते हैं एक लैम्ब्डा अभिव्यक्ति के बजाय और इस के लिए LINQ बदल दिया है:

var thing = things.Select(t => t.Type == 1 && t.IsActive).SingleOrDefault(); 

अब Resharper मुझे (thing == null) के लिए Expression is always false कह रहा है।

मुझे क्या याद आया?

उत्तर

15

आप चाहते हैं:

var thing = things.Where(t => t.Type == 1 && t.IsActive).SingleOrDefault(); 

Select (, मूल्यों true अगर t.Type == 1 && t.IsActive == true साथ IEnumerable<bool> करने के लिए IEnumerable<Thing> से IEnumerable के प्रकार परिवर्तित करने अन्यथा false) एक प्रक्षेपण करता है, तो SingleOrDefault रिटर्न या तो केवल bool इस क्रम में , या अनुक्रम खाली होने पर bool का डिफ़ॉल्ट मान false है। bool एक संदर्भ प्रकार नहीं है क्योंकि यह कभी शून्य नहीं हो सकता है। , IEnumerable<Thing> के रूप में IEnumerable के प्रकार छोड़ने -

Where एक फ़िल्टर कार्रवाई (इस मामले में केवल उन्हीं का चयन जहां Type1 और IsActivetrue है केवल उन वस्तुओं है कि किसी भी कसौटी को पूरा बाहर खींच) करता है। मान लें कि Thing एक वर्ग है, SingleOrDefault अनुक्रम या null में एकमात्र आइटम लौटाएगा।

किसी भी मामले में, SingleOrDefault एक अपवाद फेंक देगा यदि अनुक्रम में एक से अधिक आइटम हैं (जो Select संस्करण में कहीं अधिक संभावना है!)।

+1

भयानक। बहुत धन्यवाद! – Shevek

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