قارن قائمتين تحتوي على الكثير من الكائنات (الجزء 2)

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

سؤال

بالإشارة إلى السؤال الذي طرحته سابقا:قارن قائمتين تحتويان على الكثير من الكائنات

ومن المثير للإعجاب أن نرى مدى سرعة هذه المقارنة هو مايد من خلال تنفيذ واجهة إيكواليتيكومبارر: مثال هنا

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

public class MyFileComparer2 : IEqualityComparer<MyFile>
{

    public bool Equals(MyFile s, MyFile d)
    {
        return
            s.compareName.Equals(d.compareName) &&
            s.size == d.size &&
            s.deepness == d.deepness &&
            s.dateModified.Date <= d.dateModified.Date;  // This line does not work. 
            // I also tried comparing the strings by converting it to a string and it does
            // not work. It does not give me an error but it does not seem to include the files
            // where s.dateModified.Date < d.dateModified.Date

    }

    public int GetHashCode(MyFile a)
    {
        int rt = (a.compareName.GetHashCode() * 251 + a.size.GetHashCode() * 251 + a.deepness.GetHashCode() + a.dateModified.Date.GetHashCode());

        return rt;

    }
}

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

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

المحلول

منذ كائنات DateTime تختلف في الحالة عندما يكون DateTime أقل من الآخر، يمكنك الحصول على Hashcodes مختلفة للكائنات s و d ، والطريقة المساواةلا يسمى.من أجل مقارنة التواريخ بالعمل، يجب عليك إزالة جزء التاريخ من طريقة Gethashcode: giveacodicetagpre.

نصائح أخرى

النهج الخاص بك كله معيبة من الناحية المالية لأن الخاص بك IEqualityComparer.Equals الطريقة ليست متماثلة.هذا يعني Equals(file1, file2) لا يساوي Equals(file2, file1) بسبب الطريقة التي تستخدم بها أقل من المشغل.

الوثائق:

ينص بوضوح:

ملاحظات للمنفذين

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

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

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

gethashode الخاص بك لديه مشكلة: giveacodicetagpre.

قمت بتغيير جزء التاريخ لأنني كنت بحاجة أيضا إلى الوقت لذلك يمكنني استخدام خاصية القراد بدلا من ذلك.لقد تخلصت من رمز Datemodified Fundhed ويعمل بشكل رائع.وهنا كيف قمت بتعديل برنامجي.كنت أواجه مشكلة في مقارنة التواريخ، لذلك استخدمت خاصية القراد. giveacodicetagpre.

ما زلت لا أعرف كيف تعمل وظيفة رمز التجزئة هذا.الشيء الجميل هو أنه يعمل بشكل رائع.

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