112. Dictionary IEqualityComparer constructor overload

בפעם הקודמת הכרנו מעט את IEqualityComparer והבטחתי דוגמאות לשימוש בFramework.

דוגמא נחמדה היא הבאה:

נניח שאנחנו רוצים לגשת לערכים לDictionary שהמפתחות שלו הן מחרוזות, אבל ללא case sensitive.

1
IDictionary<string, object> nameToValue = new Dictionary<string, object>();

עד היום היינו עושים את זה כך:

הכנסה לDictionary:

1
nameToValue[givenName.ToUpper()] = givenValue;

הוצאה מהDictionary:

1
requestedValue = nameToValue[givenName.ToUpper()];

מה הבעיה פה? כמו בטיפ מספר 5, בכל פעם שאנחנו ניגשים לDictionary, אנחנו בעצם יוצרים אובייקט חדש (ע"י קריאה לToUpper).

כלומר כל גישה יוצרת אובייקט חדש, וזה אובייקט מבוזבז – מבזבז לנו זמן (ביצירה) וזכרון.

במקום, נוכל להיזכר בקיומם של

בFramework. מסתבר שישConstructor של הטיפוס Dictionary<TKey, TValue> שמקבל IEqualityComparer<TKey> לפיו הוא משווה ערכים.
1
2
3
4
5
6
בזכות הטיפ היומי של אתמול נוכל לעשות משהו כזה:
```csharp
IDictionary<string, object> nameToValue =
new Dictionary<string, object>(new StringIgnoreCaseSensitiveComparer());

וכעת נוכל לגשת לDictionary בשיטה הרגילה

1
2
nameToValue[givenName] = givenValue;
requestedValue = nameToValue[givenName];

בלי ליצור אובייקט חדש בכל גישה לDictionary.

הערה: המימוש של אתמול של StringIgnoreCaseSensitiveComparer דווקא כן יוצר אובייקט חדש בכל גישה לDictionary, כי אנחנו קוראים בGetHashCode לToUpper. נראה בהמשך דרך אחרת להשתמש בEqualityComparer שמתעלם מCase sensitive, ולא יוצר אובייקט חדש בכל גישה.

המשך שבוע שווה

שתף