मुझे संग्रह की आवश्यकता है, std::set के समान, इसलिए प्रत्येक तत्व को केवल एक बार डाला जा सकता है, लेकिन मुझे यह तय करने के लिए अपना कस्टम तुलनित्र प्रदान करने की आवश्यकता है कि क्या तत्व समान हैं। मैं इसे सी # में कैसे कर सकता हूं? लगता है सी # बिल्कुल सेट नहीं है?

0
Random 12 जिंदा 2022, 14:27

4 जवाब

.NET एक अनियंत्रित सेट प्रकार के साथ आता है जिसे कहा जाता है। HashSet<T>, जिसके कई निर्माता उपयोगकर्ता द्वारा प्रदत्त IEqualityComparer<T> उदाहरण:

var set = new HashSet<string>(StringComparer.CurrentCultureIgnoreCase);

set.Add("abc"); // the statement returns `true`
set.Add("def"); // the statement returns `true`
set.Add("abc"); // returns `false`, abc already exists in set

set.Contains("abc"); // returns `true` as expected
set.Contains("ABC"); // also `true`, thanks to our case-insensitive comparer
3
Mathias R. Jessen 12 जिंदा 2022, 14:32
लेकिन कस्टम IEqualityComparer के साथ फ़ंक्शन GetHashCode फ़ंक्शन को कॉल करता है और तत्वों के हैश की तुलना करता है, एक के बराबर नहीं, जो दो आइटम को पैरामीटर के रूप में स्वीकार करता है ..
 – 
Random
12 जिंदा 2022, 14:39
1
हैशसेट पहले GetHashCode और फिर Equals का उपयोग करता है।
 – 
Guru Stron
12 जिंदा 2022, 14:45
इसमें केवल GetHashCode का उपयोग होता है, और हैशकोड्स की तुलना स्वयं तत्वों की नहीं, यह वही है जो मैं डीबगर में देखता हूं
 – 
Random
12 जिंदा 2022, 14:47
इस बात पर ध्यान दिए बिना कि आप IEqualityComparer के कस्टम कार्यान्वयन की आपूर्ति करते हैं या नहीं - GetHashCode() सेट के अंतर्निहित हैशटेबल-जैसे भंडारण में लक्ष्य बकेट को हल करने के लिए आवश्यक है - Equals का उपयोग किया जाता है टकरावों को हल करने के लिए। स्रोत देखें
 – 
Mathias R. Jessen
12 जिंदा 2022, 14:49
तो आपको अपने कस्टम तुलनाकर्ता और/या डीबग डेटा की जांच करने की आवश्यकता है, क्योंकि Equals स्पष्ट रूप से इस्तेमाल किया हुआ। हालांकि स्पष्ट कारणों से इसका उपयोग केवल तभी किया जाएगा जब हैशकोड मेल खाते हों।
 – 
Guru Stron
12 जिंदा 2022, 14:50

आप जिस वस्तु की तलाश कर रहे हैं वह HashSet<T> है, जो केवल एक बार आइटम जोड़ेगी।

यदि आप अपनी समानता तुलनाओं को लागू करना चाहते हैं, तो आप कक्षा को IEqualityComparer<T> लागू कर सकते हैं और वहां समानता के लिए तर्क प्रदान कर सकते हैं।

2
Majd Odeh 12 जिंदा 2022, 14:31

आप एक HashSet एक कस्टम IEqualityComparer<T> इंस्टेंस के साथ।

2
canton7 12 जिंदा 2022, 14:33

आप का उपयोग कर सकते हैं SortedSet<T> जिसमें constructor कस्टम IComparer और डुप्लिकेट आइटम की अनुमति नहीं देता है:

सॉर्टेडसेट ऑब्जेक्ट प्रदर्शन को प्रभावित किए बिना सॉर्ट किए गए क्रम को बनाए रखता है क्योंकि तत्वों को डाला और हटा दिया जाता है। डुप्लिकेट तत्वों की अनुमति नहीं है. मौजूदा आइटम्स के सॉर्ट मानों को बदलना समर्थित नहीं है और इससे अनपेक्षित व्यवहार हो सकता है।

या SortedDictionary<TKey,TValue> कस्टम तुलनाकर्ता चाबियों के लिए।

2
Guru Stron 12 जिंदा 2022, 14:58