सी शार्प .NET में Equals
विधि और SetEquals
विधि है। अंतर कहाँ है?सेट के लिए एक अलग बराबर विधि क्यों है?
जावा से आ रहा है, मेरा पहला विचार यह था कि SetEquals
आवश्यक नहीं है, बस सभी वस्तुओं के लिए Equals
विधि का उपयोग करें।
सी शार्प .NET में Equals
विधि और SetEquals
विधि है। अंतर कहाँ है?सेट के लिए एक अलग बराबर विधि क्यों है?
जावा से आ रहा है, मेरा पहला विचार यह था कि SetEquals
आवश्यक नहीं है, बस सभी वस्तुओं के लिए Equals
विधि का उपयोग करें।
SetEquals
Equals
के समान अनुबंध का पालन नहीं करता है। विशेष रूप से यह सममित नहीं है, क्योंकि तर्क 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
का उपयोग करने की क्षमता अधिक उपयोगी है, आईएमओ।
Equals
दो और SetEquals
के बीच संदर्भ समानता के लिए चेक संग्रह पर तत्वों की जांच करेगा।
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
लौटाती है।
Equals
अगर दो HashSet
रों एक ही वस्तु हैं परीक्षण होगा।SetEquals
IEnumerable<T>
में लेता है, यह क्या होता है: "SetEquals विधि डुप्लिकेट प्रविष्टियों और अन्य पैरामीटर में तत्वों के क्रम को अनदेखा करता है।"तो SetEquals
यदि आप एक HashSet करने के लिए एक IEnumerable लोड को देखने के लिए, यह अपने स्रोत के रूप में ही HashSet उत्पन्न होगा परीक्षण के लिए है।
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.
ISet<T>.SetEquals
कार्यान्वयन
तय करता है कि वर्तमान सेट और निर्दिष्ट संग्रह एक ही होते हैं तत्वों।
Equals
कार्यान्वयन object
से विरासत में मिली
ReferenceEquals विधि के लिए एक कॉल के बराबर है।
विरासत में मिला ReferenceEquals कार्यान्वयन,
तय करता है कि निर्दिष्ट वस्तु उदाहरणों में एक ही उदाहरण हैं।
paticular में, ध्यान दें IEnumerable<T>
अनुक्रम SetEquals
के लिए पारित किसी भी क्रम में सेट के हर सदस्य के एक से अधिक हो सकता है, और SetEquals
अभी भी सच लौट आते हैं।
आपको लगता है कि दो दृश्यों की पुष्टि करना चाहते हैं उसी क्रम आप SequenceEqual
एक्सटेंशन का उपयोग कर सकते हैं में बिल्कुल एक ही सदस्य होते हैं।
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 विधि देता है यह सच है
के बराबर होती है विधि इसलिए निर्देशात्मक समानता पर एक परीक्षण हो रहा है।
आपका मतलब है कि यह 'ISet.SetEquals' http://msdn.microsoft.com/en-us/library/dd412096.aspx है? –
Jodrell
मुझे लगता है कि अंतर क्या है इस पर दस्तावेज स्पष्ट है। –