117. IComparable{T} interface

לפעמים בשביל לעשות פעולות שקשורות לגודל, אנחנו מעוניינים להשוות גדלים.

למשל, אם אנחנו מעוניינים למיין אוסף של נתונים, או למצוא איבר מקסימלי, יש לנו צורך בהשוואת איברים.

בשביל זה הומצא ממשק ששמו IComparable<T> המאפשר לנו להשוות איברים.

לממשק זה יש פונקציה אחת:

1
public int CompareTo(T other)

היא צריכה להחזיר ערך חיובי אם האיבר הנוכחי "גדול" other, ערך שלילי אם האיבר הנוכחי "קטן" מother, ואפס אם הם "שווים".

צריכות להתקיים האקסיומות הבאות:

  • לכל x מתקיים x.CompareTo(x) הוא 0. כלומר כל איבר "שווה" לעצמו
  • לכל x,y,z המקיימים x.CompareTo(y) ו y.CompareTo(z), מאותו סימן, גם x.CompareTo(z) מאותו סימן (טרנזיטיביות)
  • הסימן של x.CompareTo(y) הפוך לסימן של y.CompareTo(x)

כאשר בשלושת המקומות, אנחנו מתייחסים לסימן בתור "חיובי", "שלילי" ו"אפס".

למשל, בטיפוס string, מממשים את IComparable<string>, ומשווים מחרוזות לפי המקום שלהם במילון. למיון כזה קוראים מיון לקסיקאלי.

כעת נוכל להשתמש בזה במספר מקומות. למשל, בטיפ מספר 102 ציינו כי קיים Extension Method שלIEnumerable<T>, שנקרא Max המאפשר לנו למצוא מקסימום של אוסף.

לפי מה מתבצעת ההשוואה? לפי הפונקציה CompareTo, במידה והטיפוס מממש את הממשק IComparable<T>.

בדומה לEquals, מדובר בממשק שהרבה פונקציות בFramework יודעות לעבוד איתו. אולי נתקל בכמה מהן בהמשך.

המשך יום בר השוואה טוב

שתף