2009-09-09 14 views
16

का उपयोग करते समय काम नहीं कर रहा है मुझे सूची समानता की जांच करने में कोई समस्या हो रही है। मेरे मामले में, मेरे पास दो भूमिका वस्तुएं हैं और मैं देखना चाहता हूं कि वे बराबर हैं या नहीं। प्रत्येक भूमिका में एक नाम और अनुमतियों की एक सूची होती है। प्रत्येक अनुमति में केवल एक नाम होता है।सी # में सूची समानता की जांच करना। निबर्ननेट

public class Role : BaseDomain 
{ 
     virtual public String Name { get; set; } 
     virtual public IList Permissions { get; set; } 
} 

public class Permission 
{ 
     virtual public String Name { get; set; } 
} 

मैंने भूमिका और अनुमति वस्तुओं दोनों पर एक समान विधि परिभाषित की है। इन ऑब्जेक्ट्स को निबर्ननेट का उपयोग करके डेटाबेस से लोड किया जाता है। इसका अर्थ यह है कि भूमिका में वास्तव में NHibernate.Collection.PersistentBag के किसी ऑब्जेक्ट में सभी अनुमतियां होती हैं जो IList इंटरफ़ेस को लागू करती हैं।

if (!IList.Equals(Permissions, otherObj.Permissions)) return false; 

यह हमेशा झूठे लौट जाता है:

भूमिका वर्ग के बराबर विधि में मैं इस प्रकार है एक शर्त है। यहां तक ​​कि जब सूची में अनुमतियों में समान क्रम में समान नाम वाले ऑब्जेक्ट होते हैं। यह समझ में आता है अगर मैंने अनुमति ऑब्जेक्ट के लिए बराबर विधि लागू नहीं की है, लेकिन मेरे पास है।

जब मैं इस तरह एक बयान निष्पादित करें:

role1.equals(role2); 

क्या होता है कि यह पहली बार भूमिका वस्तु की विधि के बराबर होती है के लिए चला जाता है। अच्छा। बराबर विधि यह देखने के लिए भूमिका का नाम जांचती है कि वे बराबर हैं या नहीं। वो हैं। फिर यह देखने के लिए जांच करता है कि अनुमतियां ऊपर दिए गए कोड का उपयोग कर बराबर हैं या नहीं।

मेरे पास अनुमति कक्षा के साथ-साथ GetHashCode विधि के बराबर विधि में ब्रेकपॉइंट है। जब वह कथन निष्पादित किया जाता है, न तो बराबर विधि और न ही अनुमति वर्ग पर GetHashCode विधि को बुलाया जाता है लेकिन यह हमेशा झूठा होता है। असल में, मुझे यह पता लगाने के लिए क्या नहीं होता है कि यह निर्धारित करने के लिए क्या होता है कि दो सूचियां बराबर नहीं हैं। क्या निष्पादित हो जाता है? मैं कोड की उस पंक्ति में भी कदम नहीं उठा सकता।

ऐसा लगता है कि यह काम करना चाहिए लेकिन ऐसा नहीं है। किसी के पास क्या चल रहा है पर कोई विचार है?

उत्तर

12

जब आप एक दूसरे के साथ 2 सूचियों की तुलना करते हैं, तो बराबर विधि उस सूची में मौजूद वस्तुओं की तुलना नहीं करेगी। यह सूची वस्तु की अन्य सूची वस्तु के साथ तुलना करेगा।

एक सूची एक वस्तु है, जिसकी अपनी 'पहचान' है।

उदाहरण के लिए

यह वापस आ जाएगी कभी नहीं सच:

List<int> firstList = new List<int>(); 
List<int> secondList = new List<int>(); 

firstList.Add(1); 
firstList.Add(2); 

secondList.Add(1); 
secondList.Add(2); 


Assert.IsTrue (firstList.Equals(secondList)); 

बराबर विधि सूची की सामग्री की तुलना नहीं है, लेकिन सूची में ही। यदि आप यह व्यवहार चाहते हैं, तो मुझे लगता है कि आपको अपनी खुद की सूची लागू करना होगा।

+1

लेकिन इसका मतलब यह है कि IList.Equals (obj1, obj2) विधि का कोई उपयोग नहीं है। यह विधि obj1 == obj2 जैसा ही है! आईएलआईएस इंटरफ़ेस पर यह विधि क्यों परिभाषित की गई है यदि यह कोई अतिरिक्त लाभ प्रदान नहीं करता है? क्या उन दोनों के बीच कोई अंतर है जो मुझे याद आ रही है? –

+5

आईएलआईएस इंटरफ़ेस एक समान विधि को परिभाषित नहीं करता है। सूची वर्ग में हालांकि एक समान विधि है, लेकिन, ऐसा इसलिए है क्योंकि .NET में प्रत्येक वर्ग 'ऑब्जेक्ट' से प्राप्त होता है, और समानता विधि को 'ऑब्जेक्ट' श्रेणी में परिभाषित किया जाता है। देखें: http://msdn.microsoft.com/en-us/library/system.object.aspx –

47

जैसा कि फ्रेडरिक ने कहा Equals सूचियों की सामग्री की तुलना नहीं करता है। लेकिन Enumerable.SequenceEqual करता है। अधिक जानकारी के लिए Is there a built-in method to compare collections in C#? देखें।

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