सही है, इसलिए मेरे पास एक योग्य है और इससे अलग-अलग मूल्य प्राप्त करने की इच्छा है।
का उपयोग करते हुए System.Linq
, निश्चित रूप से एक एक्सटेंशन विधि कहा जाता है Distinct
। सरल मामले में, इसका उपयोग बिना मापदंडों के साथ किया जा सकता है, जैसे:
var distinctValues = myStringList.Distinct();
अच्छी तरह से और अच्छा है, लेकिन अगर मेरे पास ऐसी वस्तुओं का बोधगम्य है जिसके लिए मुझे समानता निर्दिष्ट करने की आवश्यकता है, तो केवल उपलब्ध अधिभार है:
var distinctValues = myCustomerList.Distinct(someEqualityComparer);
समानता तुष्टिकरण तर्क का एक उदाहरण होना चाहिए IEqualityComparer<T>
। मैं यह कर सकता हूँ, बेशक, लेकिन यह कुछ हद तक क्रियात्मक है और, अच्छी तरह से, स्पष्ट है।
मुझे उम्मीद है कि एक अधिभार है जो एक मेमने को ले जाएगा, एक फंक <टी, टी, बूल> कहेंगे:
var distinctValues
= myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);
किसी को पता है कि क्या ऐसा कुछ विस्तार मौजूद है, या कुछ बराबर वर्कअराउंड? या क्या मैं कुछ न कुछ भूल रहा हूं?
वैकल्पिक रूप से, वहाँ एक IEqualityComparer इनलाइन (मुझे शर्मिंदा) निर्दिष्ट करने का एक तरीका है?
अपडेट करें
मुझे इस विषय पर एक MSDN फोरम में एक पोस्ट के लिए एंडर्स हेजेल्सबर्ग द्वारा एक उत्तर मिला । वह कहता है:
आप जिस समस्या को चलाने जा रहे हैं, वह यह है कि जब दो वस्तुएं समान तुलना करती हैं, तो उनके पास समान GetHashCode रिटर्न वैल्यू होनी चाहिए (या फिर डिस्टिंच द्वारा आंतरिक रूप से उपयोग की जाने वाली हैश तालिका सही ढंग से काम नहीं करेगी)। हम IEqualityComparer का उपयोग करते हैं क्योंकि यह समान इंटरफ़ेस और GetHashCode के संगत कार्यान्वयन को एक एकल इंटरफ़ेस में पैकेज करता है।
मुझे लगता है कि समझ में आता है ..