2009-04-08 8 views
7

क्या यह संभव है, और यदि ऐसा है तो मैं अन्यथा List<T> की Contains विधि को ओवरराइड कैसे करूं, जहां T मेरा अपना, कस्टम प्रकार है?.NET जेनेरिक सूची <MyType> ओवरराइड करें। (MyTypeInstance) शामिल है?

+0

यह आपके प्रश्न से थोड़ा अस्पष्ट है जिसे आपको हासिल करने की आवश्यकता है। क्या आप ए) मानक की आवश्यकता है अपने कस्टम प्रकार के साथ काम करने के लिए या बी) कुछ विशेष तर्क जब कॉल कहा जाता है? –

+0

पीटर, मूल रूप से सूची मैं रनटाइम पर स्मृति में नहीं हूं, यह ओओडीबीएमएस के संदर्भ में कम/कमजोर है। यदि मैं मूल नेट करता हूं। सूची में शामिल है, यह ऑडबम्स बैकएंड से पूरी सूची पुनर्प्राप्त करता है और स्थानीय रूप से मूल्यांकन करता है। इसलिए मैं इसे उचित (बैकएंड) क्वेरी सिंटैक्स के साथ ओवरराइड करना चाहता था .. –

+0

@ जोर्ग - तो इस बात को ध्यान में रखते हुए, बराबर/GetHashCode ओवरराइड करने से आपकी समस्या (@Cans उत्तर) कैसे हल हो जाती है? –

उत्तर

5

काम करेंगे अपने स्वयं के कार्यान्वयन आप एक वर्ग है कि IList इंटरफ़ेस लागू करता है बना सकते हैं शामिल करने के लिए होता है। इस तरह आपकी कक्षा एक आईलीस्ट की तरह दिखेगी। मानक सामान करने के लिए आंतरिक रूप से वास्तविक सूची हो सकती है।

class MyTypeList : IList<MyType> 
{ 
    private List<MyType> internalList = new ...; 

    public bool Contains(MyType instance) 
    { 

    } 

    .... 
} 
2

आपको अपनी कक्षा में Equals और GetHashCode ओवरराइड करने की आवश्यकता है (MyType)।

0

आप आप की बराबरी कस्टम प्रकार लागू करते हैं तो सूची के समारोह

+0

नहीं, सूची कभी भी == ऑपरेटर का उपयोग नहीं करेगा; केवल –

+0

के बराबर नहीं लगता है कि यह एक डाउनवोट के लायक है, हालांकि। बराबर सत्य है; तय किया गया है कि (+1) –

7

List<T>EqualityComparer<T>.Default का उपयोग करता है की तुलना करने के लिए; यह देखने के लिए पहले जांचता है कि क्या आपका ऑब्जेक्ट IEquatable<T> लागू करता है; अन्यथा object.Equals का उपयोग करता है।

तो; Equals ओवरराइड करना सबसे आसान काम है (Equals में तर्क से मेल खाने के लिए हमेशा GetHashCode अपडेट करें)। वैकल्पिक रूप से, LINQ बजाय का उपयोग करें:

bool hasValue = list.Any(x => x.Foo == someValue); 
+0

@Marc Gravell: इसलिए यदि मैं 2 कस्टम वर्गों की 'समानता' का परीक्षण करना चाहता हूं जिसमें केवल गुण और फ़ील्ड हैं, तो मुझे अपनी कक्षा में IEquatable को लागू करने की आवश्यकता है? जब मैं यह धारणा करता हूं कि मुझे 2 वर्गों को 'बराबर' माना जाएगा, क्योंकि फ़ील्ड में प्रत्येक वर्ग में समान मूल्य होते हैं, तो मुझे वास्तव में थक गया होगा। :/... टिप के लिए धन्यवाद;) – IAbstract

+0

@Marc Gravell: अच्छी तरह से, तकनीकी रूप से, इससे कोई फर्क नहीं पड़ता कि वे क्या हैं। महत्वपूर्ण बात यह है कि मैं IEquatable को 'ठीक से' लागू करता हूं और उस फ़ील्ड का चयन करता हूं जो यह निर्धारित करना चाहिए कि कोई अन्य MyClass बराबर माना जाता है या नहीं। – IAbstract

+0

@ डबर्मन - बिल्कुल। और फिर अपना पहला बिंदु, आईआईआरसी structs * करते हैं * ऐसा व्यवहार करते हैं, तो आप दस लाख मील दूर नहीं थे। –

1

क्या विशिष्ट आवश्यकताओं आप अपने ओवरराइड में आपको लगता है कि ऐसा करने के लिए Linq अभिव्यक्ति का उपयोग हो सकता है पर निर्भर करता है:

list.Any(x => x.Name.Equals("asdas", .....)) // whatever comparison you need 

फिर आप यह सुविधा के लिए एक विस्तार विधि में लपेट कर सकते हैं ।

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