2009-01-29 10 views
9

के साथ उपयोग के लिए डिफ़ॉल्ट प्रकार को परिभाषित करने के लिए कैसे करें I सामान्य सूची के साथ उपयोग के लिए इस ElementAtOrDefaultOperator की आवाज़ की तरह बहुत पसंद है, लेकिन मैं यह नहीं समझ सकता कि वस्तुओं की मेरी सूची के लिए डिफ़ॉल्ट प्रकार को कैसे परिभाषित किया जाए। जो मैं समझता हूं, उससे डिफ़ॉल्ट रूप से शून्य हो जाएगी यदि मेरे पास नीचे की वस्तुओं की एक सूची है, लेकिन मैं उचित मान के साथ एक डिफ़ॉल्ट ऑब्जेक्ट का अपना संस्करण वापस करना चाहता हूं।LINQ ElementAtOrDefault ऑपरेटर

ClassA { 

string fieldA; 
string fieldB; 
ClassB fieldC; 

//constructor 

} 

List<ClassA> myObjects = new List<ClassA>(); 

myObjects.Add(//new object) 
myObjects.Add(//new object) 

तो मैं निम्न करने के लिए सक्षम होना चाहते हैं:

ClassA newObject = myObjects.ElementAtOrDefault(3); 

और newObject ClassA के एक डिफ़ॉल्ट प्रकार है कि मैं कहीं परिभाषित किया है यहाँ मैं क्या मतलब है। मैंने सोचा कि एक सेटडिफॉल्ट एलिमेंट या कुछ अन्य विधि हो सकती है लेकिन मुझे नहीं लगता कि यह अस्तित्व में है।

किसी भी विचार?

उत्तर

18

बस अपने खुद के विस्तार विधि लिखें:

static T ElementAtOrDefault<T>(this IList<T> list, int index, T @default) 
{ 
    return index >= 0 && index < list.Count ? list[index] : @default; 
} 

और कॉल:

var item = myObjects.ElementAtOrDefault(3, defaultItem); 

या यदि आप डिफ़ॉल्ट चाहते lazily मूल्यांकन किया जाना, डिफ़ॉल्ट के लिए एक Func<T> का उपयोग करें:

static T ElementAtOrDefault<T>(this IList<T> list, int index, 
    Func<T> @default) 
{ 
    return index >= 0 && index < list.Count ? list[index] : @default(); 
} 

उदाहरण के लिए, यह फ़ॉर्म आपको पूर्व परिभाषित आइटम (उदाहरण के लिए, पहले) का उपयोग करने की अनुमति देगा:

var item = myObjects.ElementAtOrDefault(3, myObjects.First); 

या अधिक लचीलेपन:

var item = myObjects.ElementAtOrDefault(3,() => myObjects[2]); 

या

var item = myObjects.ElementAtOrDefault(3,() => new MyObject {...}); 
+0

एक उपयुक्त अधिभार डिफ़ॉल्ट (टी) लौट सकते हैं LINQ कार्यान्वयन में के रूप में। – user7116

+1

@sixlettervariables - लेकिन यह पहले से ही गैर-अधिभारित, मानक LINQ ऑपरेटर में मौजूद है ... –

+0

वास्तव में आश्चर्य है कि यह पहले से ही ढांचे का हिस्सा क्यों नहीं है। यह मामूली है लेकिन मैं इस अधिभार के लिए विरासत परियोजनाओं में विस्तार कक्षाएं नहीं जोड़ना चाहता हूं। –