282. Two side dictionary

עוד מבנה שיכול להיות שימושי הוא Dictionary דו-צדדי – זהו Dictionary שאפשר לקבל ממנו ערך לפי מפתח, אבל גם הפוך – לקבל מפתח לפי הערך.

הדבר אפשרי אם ורק אם הDictionary הוא חד חד ערכי גם בערכים – כל ערך מופיע לכל היותר פעם אחת.

מימוש של דבר כזה יכול להראות בערך ככה:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
public class TwoSideDictionary<TKey, TValue>
{
private readonly IDictionary<TKey, TValue> mKeyToValue = new Dictionary<TKey, TValue>();
private readonly IDictionary<TValue, TKey> mValueToKey = new Dictionary<TValue, TKey>();
public void Map(TKey key, TValue value)
{
if (mKeyToValue.ContainsKey(key))
{
throw new ArgumentException("Key already mapped in dictionary", "key");
}
if (mValueToKey.ContainsKey(value))
{
throw new ArgumentException("Value already mapped in dictionary", "value");
}
mKeyToValue[key] = value;
mValueToKey[value] = key;
}
public TValue GetByKey(TKey key)
{
return mKeyToValue[key];
}
public TKey GetByValue(TValue key)
{
return mValueToKey[key];
}
public bool ContainsKey(TKey key)
{
return mKeyToValue.ContainsKey(key);
}
public bool ContainsValue(TValue value)
{
return mValueToKey.ContainsKey(value);
}
public TValue this[TKey key]
{
get
{
return GetByKey(key);
}
set
{
Map(key, value);
}
}
public TKey this[TValue key]
{
get
{
return GetByValue(key);
}
set
{
Map(value, key);
}
}
public IEnumerable<KeyValuePair<TKey, TValue>> KeyToValue
{
get
{
return mKeyToValue;
}
}
public IEnumerable<KeyValuePair<TKey, TValue>> ValueToKey
{
get
{
return mKeyToValue;
}
}
}

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

אפשר גם לממש את הממשק IDictionary<TKey, TValue> ע"י עטיפת הInstance של mKeyToValue.

שבוע גשום טוב!

שתף