क्या यह संभव है, और यदि ऐसा है तो मैं अन्यथा List<T>
की Contains
विधि को ओवरराइड कैसे करूं, जहां T
मेरा अपना, कस्टम प्रकार है?.NET जेनेरिक सूची <MyType> ओवरराइड करें। (MyTypeInstance) शामिल है?
उत्तर
काम करेंगे अपने स्वयं के कार्यान्वयन आप एक वर्ग है कि IList इंटरफ़ेस लागू करता है बना सकते हैं शामिल करने के लिए होता है। इस तरह आपकी कक्षा एक आईलीस्ट की तरह दिखेगी। मानक सामान करने के लिए आंतरिक रूप से वास्तविक सूची हो सकती है।
class MyTypeList : IList<MyType>
{
private List<MyType> internalList = new ...;
public bool Contains(MyType instance)
{
}
....
}
आपको अपनी कक्षा में Equals
और GetHashCode
ओवरराइड करने की आवश्यकता है (MyType
)।
आप आप की बराबरी कस्टम प्रकार लागू करते हैं तो सूची के समारोह
नहीं, सूची
के बराबर नहीं लगता है कि यह एक डाउनवोट के लायक है, हालांकि। बराबर सत्य है; तय किया गया है कि (+1) –
List<T>
EqualityComparer<T>.Default
का उपयोग करता है की तुलना करने के लिए; यह देखने के लिए पहले जांचता है कि क्या आपका ऑब्जेक्ट IEquatable<T>
लागू करता है; अन्यथा object.Equals
का उपयोग करता है।
तो; Equals
ओवरराइड करना सबसे आसान काम है (Equals
में तर्क से मेल खाने के लिए हमेशा GetHashCode
अपडेट करें)। वैकल्पिक रूप से, LINQ बजाय का उपयोग करें:
bool hasValue = list.Any(x => x.Foo == someValue);
@Marc Gravell: इसलिए यदि मैं 2 कस्टम वर्गों की 'समानता' का परीक्षण करना चाहता हूं जिसमें केवल गुण और फ़ील्ड हैं, तो मुझे अपनी कक्षा में IEquatable को लागू करने की आवश्यकता है? जब मैं यह धारणा करता हूं कि मुझे 2 वर्गों को 'बराबर' माना जाएगा, क्योंकि फ़ील्ड में प्रत्येक वर्ग में समान मूल्य होते हैं, तो मुझे वास्तव में थक गया होगा। :/... टिप के लिए धन्यवाद;) – IAbstract
@Marc Gravell: अच्छी तरह से, तकनीकी रूप से, इससे कोई फर्क नहीं पड़ता कि वे क्या हैं। महत्वपूर्ण बात यह है कि मैं IEquatable
@ डबर्मन - बिल्कुल। और फिर अपना पहला बिंदु, आईआईआरसी structs * करते हैं * ऐसा व्यवहार करते हैं, तो आप दस लाख मील दूर नहीं थे। –
क्या विशिष्ट आवश्यकताओं आप अपने ओवरराइड में आपको लगता है कि ऐसा करने के लिए Linq अभिव्यक्ति का उपयोग हो सकता है पर निर्भर करता है:
list.Any(x => x.Name.Equals("asdas", .....)) // whatever comparison you need
फिर आप यह सुविधा के लिए एक विस्तार विधि में लपेट कर सकते हैं ।
- 1. सूची <? MyType बढ़ाता है>
- 2. हाउटो ओवरराइड सूची <T> में
- 3. जेनेरिक सूची <T> विधि
- 4. जेनेरिक सूची <T> प्रतिबिंब
- 5. अज्ञात जेनेरिक सूची <T>
- 6. जेनेरिक सूची
- 7. .NET जेनेरिक
- 8. जेनेरिक सूची
- 9. सी # सिंटेक्स - जेनेरिक सूची
- 10. जेनेरिक .Net निर्माता/उपभोक्ता
- 11. जेनेरिक सूची/शब्दकोश
- 12. सी # सूची <T>। .NET 2.0
- 13. यदि वस्तु जेनेरिक सूची है
- 14. .NET जेनेरिक विधि प्रश्न
- 15. जेनेरिक एसक्यूएल बिल्डर .NET
- 16. .NET जेनेरिक सेट?
- 17. जेनेरिक सूची में डेटाटेबल कनवर्ट करें?
- 18. XmlSerializer इंटरफ़ेस की जेनेरिक सूची क्रमबद्ध करें
- 19. सी # गतिशील जेनेरिक सूची
- 20. जेनेरिक सूची का मानक विचलन?
- 21. सॉर्ट जेनेरिक सूची
- 22. .NET EventHandlers - जेनेरिक या नहीं?
- 23. जावा जेनेरिक विधि विरासत और ओवरराइड नियम
- 24. सूची <T> क्यों धागा-सुरक्षित नहीं है?
- 25. करता है .Net 4.5 में शामिल हैं .Net 4.0
- 26. एक एसटीएल मल्टीमैप एक .NET शब्दकोश <कुंजी, सूची <values>> से भिन्न कैसे है?
- 27. सूची <T> डेटाव्यू
- 28. चेक सूची <t> शामिल करता है, तो एक और सूची
- 29. <string> शामिल करें Xcode 4.2
- 30. .NET: दो जेनेरिक सूचियों का संयोजन
यह आपके प्रश्न से थोड़ा अस्पष्ट है जिसे आपको हासिल करने की आवश्यकता है। क्या आप ए) मानक की आवश्यकता है अपने कस्टम प्रकार के साथ काम करने के लिए या बी) कुछ विशेष तर्क जब कॉल कहा जाता है? –
पीटर, मूल रूप से सूची मैं रनटाइम पर स्मृति में नहीं हूं, यह ओओडीबीएमएस के संदर्भ में कम/कमजोर है। यदि मैं मूल नेट करता हूं। सूची में शामिल है, यह ऑडबम्स बैकएंड से पूरी सूची पुनर्प्राप्त करता है और स्थानीय रूप से मूल्यांकन करता है। इसलिए मैं इसे उचित (बैकएंड) क्वेरी सिंटैक्स के साथ ओवरराइड करना चाहता था .. –
@ जोर्ग - तो इस बात को ध्यान में रखते हुए, बराबर/GetHashCode ओवरराइड करने से आपकी समस्या (@Cans उत्तर) कैसे हल हो जाती है? –