כמו במקרה של Equals, לפעמים אנחנו מעוניינים להשוות איברים, באמצעות השוואה אחרת.
למשל, אנחנו עשויים לרצות להשוות מחרוזות דווקא לפי האורך שלהן, ולא לפי המקום שלהם במילון.
באופן אנלוגי לIEqualityComparer (טיפ מספר 111) המאפשר לנו להשוות איברים בצורה מלאכותית, ולאו דווקא באמצעות פונקצית הEquals של האובייקט, קיים פתרון מקביל גם עבור IComparable
הפתרון הוא ממשק ששמו IComparer
|
|
אותה אנחנו צריכים לממש, ולהחליט כיצד להשוות איברים.
קיימת גם גרסה לא גנרית של ממשק זה המשווה objectים. במידה ואנחנו מעוניינים לממש את שני הממשקים, נוכל לרשת מהטיפוס Comparer<T>. כך נצטרך רק לממש את הפונקציה הגנרית, ונקבל מימוש Out of the boxשל המימוש של objectים.
למשל, בדוגמה של השוואת מחרוזות לפי האורך שלהן:
|
|
השוואה מתבצעת באמצעות:
|
|
בנוסף, אם אנחנו מעוניינים מאיזושהי סיבה לקבל Comparer שמשתמש בפונקציה CompareTo, במידה והטיפוס שלנו מממש IComparable<T>, נוכל להשתמש בComparer הסטטי הבא:
|
|
כמובן, לרוב הפונקציות שמשתמשות בממשק IComparable<T> בשביל להשוות איברים, קיים overload שמאפשר לציין באמצעות איזה Comparer להשוות.
אולי עוד נראה לזה דוגמאות.
המשך יום בר השוואה טוב