2011-02-23 11 views
11

मैं बदलना चाहता हूं कि कुछ वर्गों के लिए डिफ़ॉल्ट (टी) कैसे व्यवहार करता है। तो मेरे संदर्भ प्रकारों के लिए शून्य लौटने की बजाय मैं एक शून्य वस्तु वापस करना चाहता हूं।सी # में कौन सा डिफ़ॉल्ट (टी) रिटर्न बदलता है?

तरह
kids.Clear(); 
var kid = kids.Where(k => k.Age < 10).SingleOrDefault(); 

if (kid is NullKid) 
{ 
    Console.Out.WriteLine("Jippeie"); 
} 

किसी का प्रकार जानते हैं कि अगर यह सब संभव है?

उत्तर

2

मुझे लगता है कि आपको पहले से ही आपके प्रश्न में जवाब मिल गया है: अगर/स्विच स्टेटमेंट। कुछ इस तरह:

if (T is Dog) return new Dog(); 
    //instead of return default(T) which is null when Dog is a class 

आप इस तरह अपने खुद के विस्तार विधि बना सकते हैं:

public static T SingleOrSpecified<T>(this IEnumerable<T> source, Func<T,bool> predicate, T specified) 
{ 
    //check parameters 
    var result = source.Where(predicate); 
    if (result.Count() == 0) return specified; 
    return result.Single(); //will throw exception if more than 1 item 
} 

उपयोग:

var p = allProducts.SingleOrSpeficied(p => p.Name = "foo", new Product()); 
+0

मुझे लगता है, सवाल बनी हुई है: कैसे किसी की ... SingleOrDefault अंदर से ऐसा कर सकते हैं()? –

+1

@ralf: Em..I नमूना कार्यान्वयन जोड़ें। मेरा संपादन देखें। –

3

मुझे नहीं लगता कि, यह संभव है। हालांकि आप क्या कर सकते हैं, अपनी खुद की विस्तार विधि SingleOrCustomDefault या ऐसा कुछ बनाना है।

+1

यह निश्चित रूप से सबसे साफ दृष्टिकोण है। सादगी के लिए –

7

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

3

कैसे इस बारे में:

var kid = kids.Where(k => k.Age < 10).SingleOrDefault() ?? new Kid(); 
+1

+1। – Lucas

+2

छोटे समतुल्य: 'var kid = kids.SingleOrDefault (k => k.Age <10) ?? नया बच्चा(); ' – smdrager

12

किसी को भी पता है कि यह सब संभव पर है?

यह बिल्कुल संभव नहीं है।

लेकिन हो सकता है आप के बजाय DefaultIfEmpty उपयोग करना चाहते हैं:

kids.Clear(); 
var kid = kids.Where(k => k.Age < 10).DefaultIfEmpty(NullKid).Single(); 

if (kid == NullKid) 
{ 
    Console.Out.WriteLine("Jippeie"); 
} 
संबंधित मुद्दे