2013-06-20 9 views
21

सी शार्प .NET में Equals विधि और SetEquals विधि है। अंतर कहाँ है?सेट के लिए एक अलग बराबर विधि क्यों है?

जावा से आ रहा है, मेरा पहला विचार यह था कि SetEquals आवश्यक नहीं है, बस सभी वस्तुओं के लिए Equals विधि का उपयोग करें।

+1

आपका मतलब है कि यह 'ISet .SetEquals' http://msdn.microsoft.com/en-us/library/dd412096.aspx है? – Jodrell

+2

मुझे लगता है कि अंतर क्या है इस पर दस्तावेज स्पष्ट है। –

उत्तर

32

SetEqualsEquals के समान अनुबंध का पालन नहीं करता है। विशेष रूप से यह सममित नहीं है, क्योंकि तर्क ISet<T> के बजाय IEnumerable<T> है। यह आपको सेट समानता की जांच करने की अनुमति देता है जबकि केवल एक सेट होता है। पर विचार करें:

List<int> intList = new List<int> { 1, 2, 3 }; 
HashSet<int> intSet = new HashSet<int>(intList); 

अब हम उपयोग कर सकते हैं:

Console.WriteLine(intSet.SetEquals(intList)); 

... लेकिन हम List<int> पर समान व्यवहार और हर दूसरे IEnumerable<T> कार्यान्वयन को लागू करने के बिना एक ही तरीके से Equals को लागू नहीं कर सका।

भले ही हम इसे अन्य सेटों तक सीमित कर दें, तो समानता का वास्तव में क्या अर्थ है इसका दिलचस्प सवाल है। उदाहरण के लिए, दो HashSet<string> सेटों पर विचार करें जिनमें एक ही तार होते हैं, लेकिन अलग समानता तुलनाकर्ता होते हैं। (शायद एक केस-संवेदी है और कोई नहीं है।) क्या वे बराबर हैं या नहीं? SetEquals बहुत सामान्य होने की कोशिश से बचकर इस तरह के दार्शनिक प्रश्नों से बचने के लिए प्रबंधन करता है।

HashSet<int> और SortedSet<int> के बारे में क्या? क्या वे कभी बराबर हो सकते हैं? उनके पास समान मूल्य हो सकते हैं - लेकिन एक का आदेश अपरिभाषित है।

कुल मिलाकर, Object.Equals और Object.GetHashCode के विचार मेरे विचार में बहुत व्यापक हैं। अक्सर आप एक विशेष टाइप समानता के प्रकार चाहते हैं - और अक्सर इसे पहले स्थान पर समानता के लिए वस्तुओं की तुलना करने का कोई अर्थ नहीं होता है। यह आसानी से एक पूरी तरह से अलग रान का विषय बना सकता है, लेकिन इस बीच में मुझे कम से कम खुशी है कि .NET ने संग्रहों के लिए इस व्यापक-व्यापक विचार को लागू करने का प्रयास नहीं किया था। एक अच्छी तरह से परिभाषित अर्थ के साथ SetEquals का उपयोग करने की क्षमता अधिक उपयोगी है, आईएमओ।

3

Equals दो और SetEquals के बीच संदर्भ समानता के लिए चेक संग्रह पर तत्वों की जांच करेगा।

10

HashSet<T>.SetEquals निर्धारित करता है कि हैशसेट में IEnumerable<T> के समान तत्व हैं या नहीं। लेकिन अगर प्रकार अलग हैं तो यह सच क्यों होना चाहिए?

HashSet<int> h = new HashSet<int>(); 
h.Add(0); 
h.Add(1); 
int[] ints = new[] { 0, 1, 1, 0 }; 
h.SetEquals(ints); // true, ignores duplicates because it's a set 
h.Equals(ints); // false, correct because not even the same types 

MSDN:

SetEquals विधि डुप्लिकेट प्रविष्टियों और अन्य पैरामीटर में तत्वों का क्रम पर ध्यान नहीं देता .....

HasetSet<T> के बाद से Equals पर हावी नहीं होता इसे इस्तेमाल करता है वह ऑब्जेक्ट से विरासत में मिला है जो सिर्फ संदर्भों की तुलना करता है। तो यदि दो वस्तुएं एक ही संदर्भ नहीं हैं तो यह false लौटाती है।

5
  • Equals अगर दो HashSet रों एक ही वस्तु हैं परीक्षण होगा।
  • SetEqualsIEnumerable<T> में लेता है, यह क्या होता है: "SetEquals विधि डुप्लिकेट प्रविष्टियों और अन्य पैरामीटर में तत्वों के क्रम को अनदेखा करता है।"

तो SetEquals यदि आप एक HashSet करने के लिए एक IEnumerable लोड को देखने के लिए, यह अपने स्रोत के रूप में ही HashSet उत्पन्न होगा परीक्षण के लिए है।

0

SetEquals:

जांच करें कि क्या HashSet एक दिया IEnumerable <T> रूप में एक ही तत्व शामिल हैं।

SetEquals विधि दूसरे संग्रह का व्यवहार करती है जैसे कि इसमें कोई डुप्लिकेट तत्व नहीं है। यदि डुप्लिकेट तत्व मौजूद हैं, तो दो संग्रह अभी भी बराबर माना जा सकता है।

बराबर:

बराबर वास्तव में एक Referential परीक्षण

List<string> stringList = new List<string> { "a", "b", "c" }; 
SortedSet<string> stringSet = new SortedSet<string> { "a", "b", "c" }; 

bool a = stringSet.SetEquals(stringList); 
// See if the two collections contain the same elements. 
0

ISet<T>.SetEquals कार्यान्वयन

तय करता है कि वर्तमान सेट और निर्दिष्ट संग्रह एक ही होते हैं तत्वों।

Equals कार्यान्वयन object से विरासत में मिली

ReferenceEquals विधि के लिए एक कॉल के बराबर है।

विरासत में मिला ReferenceEquals कार्यान्वयन,

तय करता है कि निर्दिष्ट वस्तु उदाहरणों में एक ही उदाहरण हैं।


paticular में, ध्यान दें IEnumerable<T> अनुक्रम SetEquals के लिए पारित किसी भी क्रम में सेट के हर सदस्य के एक से अधिक हो सकता है, और SetEquals अभी भी सच लौट आते हैं।


आपको लगता है कि दो दृश्यों की पुष्टि करना चाहते हैं उसी क्रम आप SequenceEqual एक्सटेंशन का उपयोग कर सकते हैं में बिल्कुल एक ही सदस्य होते हैं।

0
public static void Main(string[] args) 
     { 
      Console.WriteLine("Hello World!"); 

      System.Collections.Generic.HashSet<int> setA= new System.Collections.Generic.HashSet<int>(); 
      setA.Add(1); 
      System.Collections.Generic.HashSet<int> setB= new System.Collections.Generic.HashSet<int>(); 
      setB.Add(1); 


      Console.WriteLine("Equals method returns {0}", setA.Equals(setB)); 
      Console.WriteLine("SetEquals method returns {0}", setA.SetEquals(setB)); 


      Console.Write("Press any key to continue . . . "); 
      Console.ReadKey(true); 
     } 

उत्पादन का उत्पादन: बराबर विधि रिटर्न झूठी SetEquals विधि देता है यह सच है

के बराबर होती है विधि इसलिए निर्देशात्मक समानता पर एक परीक्षण हो रहा है।

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