This repository was archived by the owner on Jun 4, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBidirectionalDictionary.cs
More file actions
129 lines (111 loc) · 2.5 KB
/
Copy pathBidirectionalDictionary.cs
File metadata and controls
129 lines (111 loc) · 2.5 KB
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#nullable enable
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
namespace TooManyExtensions
{
public class BidirectionalDictionary<T1, T2> : IEnumerable<KeyValuePair<T1, T2>> where T1 : notnull where T2 : notnull
{
public Dictionary<T1, T2> Forward { get; } = new();
public Dictionary<T2, T1> Reverse { get; } = new();
public void Add(T1 t1, T2 t2)
{
Forward[t1] = t2;
Reverse[t2] = t1;
}
public void Remove(T1 t1)
{
Reverse.Remove(Forward[t1]);
Forward.Remove(t1);
}
public void Remove(T2 t2)
{
Forward.Remove(Reverse[t2]);
Reverse.Remove(t2);
}
public bool TryGetValue(T1 t1, [NotNullWhen(true)] out T2? t2) => Forward.TryGetValue(t1, out t2);
public bool TryGetValue(T2 t2, [NotNullWhen(true)] out T1? t1) => Reverse.TryGetValue(t2, out t1);
public T2 this[T1 t1]
{
get => Forward[t1];
set
{
Forward[t1] = value;
Reverse[value] = t1;
}
}
public T1 this[T2 t2]
{
get => Reverse[t2];
set
{
Reverse[t2] = value;
Forward[value] = t2;
}
}
public void Clear()
{
Forward.Clear();
Reverse.Clear();
}
public bool ContainsKey(T1 t1) => Forward.ContainsKey(t1);
public bool ContainsKey(T2 t2) => Reverse.ContainsKey(t2);
public int Count => Forward.Count;
public IEnumerable<T1> Keys => Forward.Keys;
public IEnumerable<T2> Values => Forward.Values;
public IEnumerator<KeyValuePair<T1, T2>> GetEnumerator() => Forward.GetEnumerator();
public bool Remove(KeyValuePair<T1, T2> kvp)
{
if (Forward.Remove(kvp.Key) && Reverse.Remove(kvp.Value))
{
return true;
}
return false;
}
public bool Remove(KeyValuePair<T2, T1> kvp)
{
if (Reverse.Remove(kvp.Key) && Forward.Remove(kvp.Value))
{
return true;
}
return false;
}
public bool TryAdd(T1 t1, T2 t2)
{
if (Forward.TryAdd(t1, t2))
{
Reverse.TryAdd(t2, t1);
return true;
}
return false;
}
public bool TryRemove(T1 t1, [NotNullWhen(true)] out T2? t2)
{
if (ContainsKey(t1))
{
t2 = Forward[t1];
Forward.Remove(t1);
Reverse.Remove(t2);
return true;
}
t2 = default;
return false;
}
public bool TryRemove(T2 t2, [NotNullWhen(true)] out T1? t1)
{
if (ContainsKey(t2))
{
t1 = Reverse[t2];
Forward.Remove(t1);
Reverse.Remove(t2);
return true;
}
t1 = default;
return false;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}