यह IEqualityComparer<T>
( EqualityComparer<T>.Default
जब तक आप निर्माण पर एक अलग निर्दिष्ट नहीं करते हैं) का उपयोग करता है ।
जब आप सेट में एक तत्व जोड़ते हैं, तो यह हैश कोड का उपयोग करके मिल जाएगा IEqualityComparer<T>.GetHashCode
, और हैश कोड और तत्व दोनों को संग्रहीत करेगा (यह जांचने के बाद कि तत्व पहले से ही सेट में है, निश्चित रूप से)।
एक तत्व को देखने के लिए, यह पहले IEqualityComparer<T>.GetHashCode
हैश कोड को खोजने के लिए उपयोग करेगा , फिर समान हैश कोड वाले सभी तत्वों के लिए, यह IEqualityComparer<T>.Equals
वास्तविक समानता के लिए तुलना करने के लिए उपयोग करेगा ।
इसका मतलब है कि आपके पास दो विकल्प हैं:
IEqualityComparer<T>
कंस्ट्रक्टर में एक कस्टम पास करें । यदि आप T
स्वयं को संशोधित नहीं कर सकते हैं , या यदि आप एक गैर-डिफ़ॉल्ट समानता संबंध चाहते हैं (जैसे "नकारात्मक उपयोगकर्ता आईडी वाले सभी उपयोगकर्ताओं को समान माना जाता है") तो यह सबसे अच्छा विकल्प है । यह लगभग कभी भी स्वयं प्रकार पर लागू नहीं होता है (अर्थात Foo
लागू नहीं होता है IEqualityComparer<Foo>
) लेकिन एक अलग प्रकार में जिसका उपयोग केवल तुलना के लिए किया जाता है।
- ओवरराइड करके
GetHashCode
और टाइप करके, स्वयं में समानता को लागू करें Equals(object)
। आदर्श रूप IEquatable<T>
में, प्रकार में भी लागू करें , खासकर अगर यह एक मूल्य प्रकार है। इन विधियों को डिफ़ॉल्ट समानता तुलनित्र द्वारा बुलाया जाएगा।
ध्यान दें कि आदेशित तुलना के संदर्भ में यह कैसे नहीं है - जो समझ में आता है, क्योंकि निश्चित रूप से ऐसी परिस्थितियां हैं जहां आप आसानी से समानता निर्दिष्ट कर सकते हैं लेकिन कुल आदेश नहीं। यह सभी समान है Dictionary<TKey, TValue>
, मूल रूप से।
यदि आप एक ऐसा सेट चाहते हैं जो सिर्फ समानता तुलना के बजाय ऑर्डर का उपयोग करता है , तो आपको SortedSet<T>
.NET 4 से उपयोग करना चाहिए - जो आपको IComparer<T>
इसके बजाय निर्दिष्ट करने की अनुमति देता है IEqualityComparer<T>
। यह उपयोग करेगा IComparer<T>.Compare
- जो आप का उपयोग कर रहे हैं IComparable<T>.CompareTo
या IComparable.CompareTo
यदि आप को सौंप देंगे Comparer<T>.Default
।
IEqualityComparer<T>
कंस्ट्रक्टर में एक कार्यान्वयन जोड़ें या इसे कक्षा में लागू करेंa
। msdn.microsoft.com/en-us/library/bb301504(v=vs.110).aspx