الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

IComparable and ICompare in c#.Net

مغلق
بدأه eng_3llam في 10 أبريل 2006 · 1 رد · 755 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

السلام عليكم

إنهاردة بأذن الله هنعرف مع بعض ماهو الIComparable و IComparer وما الفرق بينه

على إفتراض أن عندى array of string كما موضح :

string[] s = new string[3] { "Mohammed ", "Ahmed", "Said" };

وحبيت أعمل sort لتلك المصفوفة هستخدم الStatic Method ألا وهى Sort الموجودة فى Array class كما موضح:

Array.Sort(s);

وبالتالى سيتم ترتيب المصفوفة وذلك لان string class يدعم الIComparable طب لو حبيت أقارن أو أرتب Custom Objects وبالتالى لازم أعرف إحدى الtwo interfaces أو كلاهما كما سنعرف.

لو عندى Person class كالتالى:

class Person
        {
            public string fName,lName;

            public int age;
            public Person(string fName , string lName , int age)
            {
                this.fName = fName;
                this.lName = lName;
                this.age = age; 
            }

            public override string ToString()
            {
                return String.Format("{0} {1} has {2} years old", this.fName, this.lName, this.age);
            }
}

وجميعهم public للتسهيل فقط. وعملت array of person types كما موضح

Person[] array = new Person[4] 
            {
                new Person("Mohammed","Allam",19),
                new Person("Ahmed","Ebrahim",12),
                new Person("Asmaa","Minshawy",4),
                new Person("Zariff","gidan",5)
            };

وبعد كدة ناديت الsort علشان أرتب المصفوفة

  Array.Sort(array);

وبالتالى عند عمل running للبرنامج ستجد InvaildOperationException حيث فشل فى عملية الترتيب للCustom objects حيث عند مشاهدة الDetails for this Exception ستجد عند الArgumentException تلك الرسالة "{"At least one object must implement IComparable."}".وبالتالى علشان أحل تلك المشكلة لازم أعملimplement للIComparable حيث ذلك الinterface يمكن الcustom objects إن يتم ترتيبها إعتمادا على key محدد يعنى ممكن أرتب الarray بتاعتنا عن طريق الID أو عن طريق الfName وهكذا

حيث ذلك الinterface معرف كما يلى

interface IComparable
        {
            int CompareTo(object o);
        }

حيث الreturn value ممكن تكون إحدى القيم من القيم التالية:

0 تعنى أن الinstance object يساوى الSpecified object

1 تعنى أن الinstance object أكبر من الSpecified object

- 1 تعنى أن الinstance object أقل من الSpecified object

وبالتالى لازم Person class يعمل implement للIComparable كالتالى

class Person:IComparable
        {
//……………..
int IComparable.CompareTo(object obj)
            {
                Person p = (Person)obj;
                if (this.age == p.age)
                    return 0;
                if (this.age > p.age)
                    return 1;
                else
                    return -1;
//……………………………
            }
}

وبالتالى فى تلك الحالة سيتم تريب المصفوفة على حسب الage .

طب فى حالة أن أنا عاوز أرتب المصفوفة على حسب الfName ببساطة ممكن أعدل فى تعريف Compare method طب لو حبيت أرتب المصفوفة مرة على حسب الID ومرة أخرى على حسب الfName ومرة ثالثة على حسب الlName وبالتالى فى تلك الحالة لازم أعمل implement للIComparer .

حيث عبارة عن interface موجود داخل الnamespace System.Collection

كالتالى

interface IComparer
        {
            int Compare(object o1, object o2);
        }

وبالتالى هستخدم فى حالتنا هستخدم للمقارنة بين الtwo objects عن طريق الfName وبالتالى هعمل helper class إسمة CompareByName يعمل implement لذلك ال

interface(IComparer) .

class CompareByName: IComparer
        {
            public CompareByName()
            {

            }
            int IComparer.Compare(object o1, object o2)
            {
                Person p1 = (Person)o1;
                Person p2 = (Person)o2;
                return String.Compare(p1.fName, p2.fName);
            }

        }

أما فى حالة إستخدامان لذلك هنستخدم الoverload of sort method كما موضح

Void Array.Sort(Array array , IComparer comparer);

حيث الargument الثانى عبارة عن reference للclass اللى عامل implement للIComparer interface وفى حالتنا دى سيكون reference to CompareByName كما موضح

Array.Sort(array, new CompareByName());

وبالتالى سيتم تريب العناصر عن طريق الfName وأيضا ممكن تعريفanother helper class لتريب العناصر عن طريق الlName

فى المرفقات Console Application مستخدم الIComparable وأيضا الIcomparer عن طريق Inner helper classes للمقارنة مرة بالfName and lName

وفى النهاية ما الفرق بينهما(Icomparable VS IComparer)

10_04_06_07_42_28_1144680148untitled.jpg

وبكدة يارب يكون وضح كيفية إستخدام الTwo Interfaces وما الفرق بينهما وبالتوفيق بأذن الله

stringbuilders.rar

تم تعديل هذه المشاركة بواسطة eng_3llam في 10 أبريل 2006 في 17:48

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#2

ما شاء الله ... الدرس رائع

هذا الموضوع مغلق.

مواضيع مشابهة