לפעמים אנחנו מעוניינים בDictionary שמבוסס יותר ממפתח אחד,
למה הכוונה?
אנחנו רגילים לDictionary עם מפתח אחד, זה בד”כ מיפוי בין איזשהו מפתח (חד חד ערכי) לערך אחר.
למשל, נניח מיפוי בין תעודת זהות של אדם, לשם שלו.
אבל ניתן להרחיב את הקונספט לDictionary מבוסס מספר מפתחות,
למשל, המושג של מספר תעודת זהות הוא באמת חד חד ערכי, אבל רק בהקשר של מדינה מסוימת.
לכן היינו רוצים לייצג איזשהו מיפוי מסוים בין מדינות ותעודות זהות, לשמות של אנשים.
הדרך הפשוטה ביותר ליצור מימוש כזה היא ע”י שימוש באיזושהי מחלקה המייצגת זוג, למשל KeyValuePair, או Tuple (אם יש לכם יותר מזל ואתם מתכנתים בFramework 4.0, ראו גם טיפים 17, 126)
זה נראה ככה בערך:
|
|
(ראו גם טיפ מספר 18, 126)
וגישה לDictionary מתבצעת כך:
|
|
ניתן גם לרשת מDictionary כדי להוסיף Overloadים נוחים:
|
|
שימו לב שהירושה נותנת לנו בעיקר שלושה דברים:
- את האפשרות להגדיר את הDictionary בצורה יותר נוחה: DoubleKeyDictionary<string, int, string> במקום Dictionary<Tuple<string, int>, string>
את הIndexer הנוח המאפשר לנו לכתוב כך:
12string israeliPiMinister = stateAndIdToName["Israel", 314159260];stateAndIdToName["Israel", 314159260] = "Haim Pi";את פונקציית הAdd, המאפשרת לנו להגדיר את הDictionary בצורה יותר נוחה (ראו גם טיפ מספר 18):
123456DoubleKeyDictionary<string, int, string> stateAndIdToName =new DoubleKeyDictionary<string, int, string>(){{"Israel", 314159260, "Haim Pi"},{"Egypt", 314159260, "Achmad Pi"},};
בשביל שתי המתודות הנוספות, אפשר גם לא לרשת, ולהפוך אותן לExtension Methods של IDictionary<Tuple<TKey1, TKey2>, TValue>. החל מC# 6.0 אפשר גם להפוך את Add לExtension Method מתאים בשביל לקבל את הסינטקס הנ"ל.
המשך יום פעמיים כי טוב