فحص المساواة قائمة في C # .NET لا يعمل عند استخدام Nhibernate

StackOverflow https://stackoverflow.com/questions/1401554

  •  05-07-2019
  •  | 
  •  

سؤال

ويبدو لي أن لديها مشكلة مع التحقق من وجود المساواة القائمة. في حالتي، ولدي كائنين دور وأريد أن أرى إذا كانت تساوي. يحتوي كل دور على اسم وقائمة الأذونات. يحتوي كل إذن مجرد اسم.

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. وهذا يعني أن دور يحتوي في الواقع جميع صلاحيات كائن من نوع NHibernate.Collection.PersistentBag التي تطبق الواجهة IList.

في طريقة متساوين من الطبقة دور لدي حالة كما يلي:

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

وهذا يعود دائما كاذبة. حتى عندما يكون ضوابط في قائمة تحتوي على الكائنات مع أسماء متطابقة من أجل متطابقة. هذا من شأنه أن يكون له معنى إذا لم أكن قد نفذت يساوي أسلوب للكائن إذن، ولكن لدي.

وعندما تنفيذ مثل هذا البيان:

role1.equals(role2);

وما يحدث هو أن يذهب أولا إلى كائن دور ويساوي الأسلوب. حسن. طريقة متساوين يتحقق اسم الدور لمعرفة ما إذا كانت متساوية. هم انهم. ثم يتحقق لمعرفة ما إذا كانت الأذونات متساوين باستخدام رمز المذكورة أعلاه.

ولدي نقطة توقف في طريقة متساوين من الطبقة إذن فضلا عن أسلوب GetHashCode. عندما يتم تنفيذ هذا البيان، ويسمى لا طريقة متساوين ولا طريقة GetHashCode على الطبقة إذن ولكنه يعود دائما كاذبة. في الحقيقة، أنا لا يمكن أن ينظر إليها لمعرفة ما يحدث من أجل تحديد أن القائمتين ليست متساوية. ما يعدم؟ لا أستطيع أن خطوة حتى في هذا الخط من التعليمات البرمجية.

وهذا يبدو وكأنه ينبغي لها أن تعمل ولكن لم يحدث ذلك. أي شخص لديه أي أفكار حول ما يجري؟

هل كانت مفيدة؟

المحلول

وعند مقارنة 2 القوائم مع بعضها البعض، فإن طريقة يساوي NOT مقارنة العناصر الموجودة في تلك القائمة. وسوف مقارنة الكائن قائمة مع الكائن قائمة أخرى.

وهناك قائمة هي كائن، والتي لديها قناعاتها 'الهوية'.

وهذا على سبيل المثال، لن يعود صحيحا:

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));

وهذه الطريقة لا يساوي مقارنة محتويات القائمة، لكن القائمة نفسها. إذا كنت تريد هذا السلوك، وأعتقد أن عليك أن تنفيذ نوع الخاصة بك من القائمة.

نصائح أخرى

وكما قال فريدريك Equals لا يقارن محتويات القوائم. لكن Enumerable.SequenceEqual يفعل. شيك هل هناك طريقة المدمج في لمقارنة المجموعات في C #؟ للحصول على مزيد من المعلومات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top