1 | #Region "Microsoft.VisualBasic::3eb16803ff94b94d0fb4295fc5b9b574, Microsoft.VisualBasic.Core\ComponentModel\System.Collections.Generic\Dictionary(Of T, V).vb" |
2 | |
3 | ' Author: |
4 | ' |
5 | ' asuka (amethyst.asuka@gcmodeller.org) |
6 | ' xie (genetics@smrucc.org) |
7 | ' xieguigang (xie.guigang@live.com) |
8 | ' |
9 | ' Copyright (c) 2018 GPL3 Licensed |
10 | ' |
11 | ' |
12 | ' GNU GENERAL PUBLIC LICENSE (GPL3) |
13 | ' |
14 | ' |
15 | ' This program is free software: you can redistribute it and/or modify |
16 | ' it under the terms of the GNU General Public License as published by |
17 | ' the Free Software Foundation, either version 3 of the License, or |
18 | ' (at your option) any later version. |
19 | ' |
20 | ' This program is distributed in the hope that it will be useful, |
21 | ' but WITHOUT ANY WARRANTY; without even the implied warranty of |
22 | ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
23 | ' GNU General Public License for more details. |
24 | ' |
25 | ' You should have received a copy of the GNU General Public License |
26 | ' along with this program. If not, see <http://www.gnu.org/licenses/>. |
27 | |
28 | |
29 | |
30 | ' /********************************************************************************/ |
31 | |
32 | ' Summaries: |
33 | |
34 | ' Class HashTable |
35 | ' |
36 | ' Constructor: (+1 Overloads) Sub New |
37 | ' |
38 | ' Class Dictionary |
39 | ' |
40 | ' Constructor: (+3 Overloads) Sub New |
41 | ' |
42 | ' Function: Find, GetValueList, Remove, SafeGetValue, (+2 Overloads) TryGetValue |
43 | ' |
44 | ' Sub: Add, AddRange, InsertOrUpdate |
45 | ' |
46 | ' Operators: (+2 Overloads) -, ^, +, <=, >= |
47 | ' |
48 | ' |
49 | ' /********************************************************************************/ |
50 | |
51 | #End Region |
52 | |
53 | Imports System.Runtime.CompilerServices |
54 | Imports Microsoft.VisualBasic.ComponentModel.Collection.Generic |
55 | Imports Microsoft.VisualBasic.Language |
56 | Imports Microsoft.VisualBasic.Language.Default |
57 | Imports Microsoft.VisualBasic.Linq |
58 | |
59 | Namespace ComponentModel.Collection |
60 | |
61 | Public Class HashTable(Of T) : Inherits Dictionary(Of String, T) |
62 | |
63 | ReadOnly assert As Assert(Of Object) |
64 | |
65 | Default Public Overloads Property Item(key As String) As DefaultValue(Of T) |
66 | Get |
67 | Dim value As T = If(ContainsKey(key), MyBase.Item(key), Nothing) |
68 | Return New DefaultValue(Of T)(value, assert) |
69 | End Get |
70 | Set(value As DefaultValue(Of T)) |
71 | MyBase.Item(key) = value.DefaultValue |
72 | End Set |
73 | End Property |
74 | |
75 | Sub New(copy As Dictionary(Of String, T), Optional assert As Assert(Of Object) = Nothing) |
76 | Call MyBase.New(copy) |
77 | |
78 | Me.assert = assert |
79 | End Sub |
80 | End Class |
81 | |
82 | ''' <summary> |
83 | ''' Represents a collection of keys and values.To browse the .NET Framework source |
84 | ''' code for this type, see the Reference Source. |
85 | ''' </summary> |
86 | ''' <typeparam name="V"></typeparam> |
87 | Public Class Dictionary(Of V As INamedValue) : Inherits SortedDictionary(Of String, V) |
88 | ' Implements IEnumerable(Of V) |
89 | |
90 | Default Public Overloads Property Item(o As V) As V |
91 | <MethodImpl(MethodImplOptions.AggressiveInlining)> |
92 | Get |
93 | Return MyBase.Item(o.Key) |
94 | End Get |
95 | Set(value As V) |
96 | MyBase.Item(o.Key) = value |
97 | End Set |
98 | End Property |
99 | |
100 | ''' <summary> |
101 | ''' 不存在的键名或者空值的键名都会返回``Nothing`` |
102 | ''' </summary> |
103 | ''' <param name="key"></param> |
104 | ''' <returns></returns> |
105 | Default Public Overloads Property Item(key As String) As V |
106 | <MethodImpl(MethodImplOptions.AggressiveInlining)> |
107 | Get |
108 | If Not key Is Nothing AndAlso ContainsKey(key) Then |
109 | Return MyBase.Item(key) |
110 | Else |
111 | Return Nothing |
112 | End If |
113 | End Get |
114 | <MethodImpl(MethodImplOptions.AggressiveInlining)> |
115 | Set(value As V) |
116 | MyBase.Item(key) = value |
117 | End Set |
118 | End Property |
119 | |
120 | ''' <summary> |
121 | ''' The <paramref name="keys"/> element counts should equals to the value length when invoke property set. |
122 | ''' </summary> |
123 | ''' <param name="keys"></param> |
124 | ''' <returns></returns> |
125 | Default Public Overloads Property Item(keys As IEnumerable(Of String)) As V() |
126 | <MethodImpl(MethodImplOptions.AggressiveInlining)> |
127 | Get |
128 | Return keys _ |
129 | .Select(Function(key) MyBase.Item(key)) _ |
130 | .ToArray |
131 | End Get |
132 | Set(value As V()) |
133 | For Each key As SeqValue(Of String) In keys.SeqIterator |
134 | MyBase.Item(key.value) = value(key) |
135 | Next |
136 | End Set |
137 | End Property |
138 | |
139 | Sub New() |
140 | Call MyBase.New |
141 | End Sub |
142 | |
143 | ''' <summary> |
144 | ''' Initializes a new instance of the System.Collections.Generic.SortedDictionary`2 |
145 | ''' class that contains elements copied from the specified System.Collections.Generic.IDictionary`2 |
146 | ''' and uses the default System.Collections.Generic.IComparer`1 implementation for |
147 | ''' the key type. |
148 | ''' </summary> |
149 | ''' <param name="source"> |
150 | ''' The System.Collections.Generic.IDictionary`2 whose elements are copied to the |
151 | ''' new System.Collections.Generic.SortedDictionary`2. |
152 | ''' </param> |
153 | Sub New(source As Dictionary(Of String, V)) |
154 | Call MyBase.New(source) |
155 | End Sub |
156 | |
157 | Sub New(source As IEnumerable(Of V)) |
158 | Call Me.New |
159 | |
160 | For Each x As V In source |
161 | Call Add(x) |
162 | Next |
163 | End Sub |
164 | |
165 | Public Function GetValueList() As List(Of V) |
166 | Return Values.AsList |
167 | End Function |
168 | |
169 | ''' <summary> |
170 | ''' Adds an element with the specified key and value into the System.Collections.Generic.SortedDictionary`2. |
171 | ''' </summary> |
172 | ''' <param name="item"></param> |
173 | Public Overloads Sub Add(item As V) |
174 | Call MyBase.Add(item.Key, item) |
175 | End Sub |
176 | |
177 | Public Sub AddRange(source As IEnumerable(Of V)) |
178 | For Each x As V In source |
179 | Call MyBase.Add(x.Key, x) |
180 | Next |
181 | End Sub |
182 | |
183 | Public Sub InsertOrUpdate(x As V) |
184 | If Me.ContainsKey(x.Key) Then |
185 | Me(x.Key) = x |
186 | Else |
187 | Call MyBase.Add(x.Key, x) |
188 | End If |
189 | End Sub |
190 | |
191 | ''' <summary> |
192 | ''' |
193 | ''' </summary> |
194 | ''' <param name="name">不区分大小写的</param> |
195 | ''' <returns></returns> |
196 | Public Function Find(name As String) As V |
197 | If MyBase.ContainsKey(name) Then |
198 | Return Me(name) |
199 | Else |
200 | Dim key As New Value(Of String) |
201 | |
202 | If Me.ContainsKey(key = name.ToLower) Then |
203 | Return Me(name) |
204 | ElseIf Me.ContainsKey(key = name.ToUpper) Then |
205 | Return Me(name) |
206 | Else |
207 | Return Nothing |
208 | End If |
209 | End If |
210 | End Function |
211 | |
212 | ''' <summary> |
213 | ''' If the value is not found in the hash directionary, then the default value will be returns, and the default value is nothing. |
214 | ''' </summary> |
215 | ''' <param name="name"></param> |
216 | ''' <param name="[default]"></param> |
217 | ''' <param name="success">可能value本身就是空值,所以在这里使用这个参数来判断是否存在</param> |
218 | ''' <returns></returns> |
219 | Public Function SafeGetValue(name As String, |
220 | Optional ByRef [default] As V = Nothing, |
221 | Optional ByRef success As Boolean = False) As V |
222 | Dim x As V = Nothing |
223 | |
224 | success = MyBase.TryGetValue(name, x) |
225 | |
226 | If success Then |
227 | Return x |
228 | Else |
229 | Return [default] |
230 | End If |
231 | End Function |
232 | |
233 | ''' <summary> |
234 | ''' Gets the value associated with the specified key.(假若找不到键值,就会返回Nothing) |
235 | ''' </summary> |
236 | ''' <param name="name">The key of the value to get.</param> |
237 | ''' <param name="success">true if the System.Collections.Generic.SortedDictionary`2 contains an element |
238 | ''' with the specified key; otherwise, false.</param> |
239 | ''' <returns>When this method returns, the value associated with the specified key, if the |
240 | ''' key is found; otherwise, the default value for the type of the value parameter.</returns> |
241 | Public Overloads Function TryGetValue(name As String, Optional ByRef success As Boolean = True) As V |
242 | Dim value As V = Nothing |
243 | success = MyBase.TryGetValue(name, value) |
244 | Return value |
245 | End Function |
246 | |
247 | Public Overloads Function TryGetValue(name$, [default] As V) As V |
248 | If MyBase.ContainsKey(name) Then |
249 | Return MyBase.Item(name) |
250 | Else |
251 | Return [default] |
252 | End If |
253 | End Function |
254 | |
255 | ''' <summary> |
256 | ''' 假若目标元素不存在于本字典之中,则会返回False |
257 | ''' </summary> |
258 | ''' <param name="x"></param> |
259 | ''' <returns></returns> |
260 | Public Overloads Function Remove(x As V) As Boolean |
261 | If Me.ContainsKey(x.Key) Then |
262 | Return Me.Remove(x.Key) |
263 | Else |
264 | Return False |
265 | End If |
266 | End Function |
267 | |
268 | ''' <summary> |
269 | ''' Adds an element with the specified key and value into the System.Collections.Generic.SortedDictionary`2. |
270 | ''' </summary> |
271 | ''' <param name="list"></param> |
272 | ''' <param name="item"></param> |
273 | ''' <returns></returns> |
274 | Public Shared Operator +(list As Dictionary(Of V), item As V) As Dictionary(Of V) |
275 | Call list.Add(item) |
276 | Return list |
277 | End Operator |
278 | |
279 | ''' <summary> |
280 | ''' Find a variable in the hash table |
281 | ''' </summary> |
282 | ''' <param name="table"></param> |
283 | ''' <param name="uid"></param> |
284 | ''' <returns></returns> |
285 | Public Shared Operator ^(table As Dictionary(Of V), uid As String) As V |
286 | If table.ContainsKey(uid) Then |
287 | Return table(uid) |
288 | Else |
289 | Return Nothing |
290 | End If |
291 | End Operator |
292 | |
293 | Public Shared Operator -(hash As Dictionary(Of V), id As String) As Dictionary(Of V) |
294 | Call hash.Remove(id) |
295 | Return hash |
296 | End Operator |
297 | |
298 | ''' <summary> |
299 | ''' 批量移除字典之中的键值对 |
300 | ''' </summary> |
301 | ''' <param name="hash"></param> |
302 | ''' <param name="keys">需要移除的键名的列表</param> |
303 | ''' <returns></returns> |
304 | Public Shared Operator -(hash As Dictionary(Of V), keys As IEnumerable(Of String)) As Dictionary(Of V) |
305 | For Each k As String In keys |
306 | Call hash.Remove(k) |
307 | Next |
308 | |
309 | Return hash |
310 | End Operator |
311 | |
312 | Public Shared Widening Operator CType(source As System.Collections.Generic.List(Of V)) As Dictionary(Of V) |
313 | Return source.ToDictionary |
314 | End Operator |
315 | |
316 | Public Shared Widening Operator CType(table As Dictionary(Of String, V)) As Dictionary(Of V) |
317 | Return New Dictionary(Of V)(table) |
318 | End Operator |
319 | |
320 | Public Shared Widening Operator CType(source As V()) As Dictionary(Of V) |
321 | Return source.ToDictionary |
322 | End Operator |
323 | |
324 | Public Shared Narrowing Operator CType(source As Dictionary(Of V)) As List(Of V) |
325 | Return New List(Of V)(source.Values) |
326 | End Operator |
327 | |
328 | Public Shared Narrowing Operator CType(table As Dictionary(Of V)) As Dictionary(Of String, V) |
329 | Return New Dictionary(Of String, V)(table) |
330 | End Operator |
331 | |
332 | ''' <summary> |
333 | ''' Get value by key. |
334 | ''' </summary> |
335 | ''' <param name="hash"></param> |
336 | ''' <param name="key"></param> |
337 | ''' <returns></returns> |
338 | Public Shared Operator <=(hash As Dictionary(Of V), key As String) As V |
339 | Return hash(key) |
340 | End Operator |
341 | |
342 | Public Shared Operator >=(hash As Dictionary(Of V), null As String) As V |
343 | Throw New NotSupportedException |
344 | End Operator |
345 | |
346 | ''' <summary> |
347 | ''' <see cref="ContainsKey(String)"/> |
348 | ''' </summary> |
349 | ''' <param name="hash"></param> |
350 | ''' <param name="null"></param> |
351 | ''' <returns></returns> |
352 | Public Shared Operator &(hash As Dictionary(Of V), null As String) As Boolean |
353 | Return hash.ContainsKey(null) |
354 | End Operator |
355 | |
356 | ''' <summary> |
357 | ''' <see cref="ContainsKey(String)"/> |
358 | ''' </summary> |
359 | ''' <param name="table"></param> |
360 | ''' <param name="x"></param> |
361 | ''' <returns></returns> |
362 | Public Shared Operator &(table As Dictionary(Of V), x As V) As Boolean |
363 | Return table & x.Key |
364 | End Operator |
365 | |
366 | Public Shared Narrowing Operator CType(map As Dictionary(Of V)) As V() |
367 | Return map.Values.ToArray |
368 | End Operator |
369 | |
370 | ' 实现这个集合接口会和字典的集合接口出现冲突 |
371 | 'Private Iterator Function IEnumerable_GetEnumerator() As IEnumerator(Of V) Implements IEnumerable(Of V).GetEnumerator |
372 | ' For Each x In MyBase.Values |
373 | ' Yield x |
374 | ' Next |
375 | 'End Function |
376 | End Class |
377 | End Namespace |