سؤال

ولدي قاموس التي أنا مقارنة مع قاموس آخر (المتغيرات كتبته كما IDictionary). القيام d1.Equals (D2) غلة كاذبة. كتابة التعليمات البرمجية بلدي أدناه ينتج الحقيقية. وSystem.Collections.Generic.Dictionary على حد سواء. أنا في عداد المفقودين شيء أو لا Dictionary يكن لديك تنفيذ Equals أن يقارن مفاتيح / القيم؟

private static bool DictEquals<K, V>(IDictionary<K, V> d1, IDictionary<K, V> d2)
{
    if (d1.Count != d2.Count)
        return false;

    foreach (KeyValuePair<K, V> pair in d1)
    {
        if (!d2.ContainsKey(pair.Key))
            return false;

        if (!Equals(d2[pair.Key], pair.Value))
            return false;
    }

    return true;
}
هل كانت مفيدة؟

المحلول

وDictionary.Equals () يستخدم الافتراضي يساوي من وجوه، والتحقق إذا كانت الأشياء هما نفس المرجعية، كما يفعل جميع المجموعات الافتراضية الأخرى. أنت حر لخلق فئة فرعية الخاصة بك مع دلالات قيمة، على الرغم من أن عادة ما يتضمن شيء يجري ثابتة أيضا.

نصائح أخرى

وربما طريقة Equals الطبقة Dictionary تلجأ ببساطة إلى تطبيق الافتراضي الموروثة من Object، أي أنه مجرد يقارن مرجع كائن Dictionary مرت مع إشارة خاصة بها. انظر هنا: Object.Equals إشارة

وإذا افترضنا أن اثنين من القواميس، واحدة كونها SortedList<TKey, TValue> واحد Dictionary<TKey, TValue>، تتم مقارنة من أجل المساواة، يجب أن حقا العودة الحقيقية إذا كانت العناصر هي نفسها؟ ومن شأن ذلك أن يكون سيئا جدا، لأن لديهم خصائص وميزات مختلفة (SortedList<,> على سبيل المثال يتيح استرجاع عن طريق رقم قياسي).

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

وذكر آخرون أنه يستخدم تنفيذ Object.Equals، يمكنك استخدام ما يلي لتجاوز ما يلي:

public class EqualsDictionary<T, T> : Dictionary<T, T>
{
    public override bool Equals(object obj)
    {
        //Place your comparison implementation here
    }
}
ويمكن استخدام

والمراجع في .NET لتغليف هوية الكائن، والجوانب قابلة للتغيير من حالته، على حد سواء، أو لا، بالإضافة إلى تغليف الجوانب الثابتة للدولة للكائن. بشكل عام، في غياب سبب معين لتولي خلاف ذلك، يفترض NET التي تستخدم إشارات إلى كائنات قابلة للتغيير لغرض التغليف الهوية. ويفترض أيضا أن في الحالات التي يكون فيها الكود هو المقارنة بين الإشارات دون معرفة ما تمثله، فمن الأفضل أن يخطئ على جانب أشياء التقارير غير متكافئة. على هذا النحو، مرجعين إلى كائنات قابلة للتغيير تعتبر عموما يعادل إذا وفقط إذا كانت تحديد نفس الكائن، وبالتالي تثبيط أنواع قابلة للتغيير من تجاوز Equals للإشارة إلى أي شيء آخر. بدلا من ذلك، رمز والذي يستخدم إشارات لتغليف دولة قابلة للتغيير يجب استخدام بعض وسائل أخرى من Object.Equals() لمقارنتها.

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