-
Notifications
You must be signed in to change notification settings - Fork 65
Expand file tree
/
Copy pathMultiMap.cs
More file actions
88 lines (81 loc) · 2 KB
/
MultiMap.cs
File metadata and controls
88 lines (81 loc) · 2 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
using System;
using System.Collections.Generic;
namespace UGFExtensions.Timer
{
public class MultiMap<T, K>: SortedDictionary<T, List<K>>
{
private readonly List<K> m_Empty = new List<K>();
public void Add(T t, K k)
{
TryGetValue(t, out var list);
if (list == null)
{
list = new List<K>();
Add(t, list);
}
list.Add(k);
}
public bool Remove(T t, K k)
{
TryGetValue(t, out var list);
if (list == null)
{
return false;
}
if (!list.Remove(k))
{
return false;
}
if (list.Count == 0)
{
Remove(t);
}
return true;
}
/// <summary>
/// 不返回内部的list,copy一份出来
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public K[] GetAll(T t)
{
TryGetValue(t, out var list);
if (list == null)
{
return Array.Empty<K>();
}
return list.ToArray();
}
/// <summary>
/// 返回内部的list
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public new List<K> this[T t]
{
get
{
TryGetValue(t, out List<K> list);
return list ?? m_Empty;
}
}
public K GetOne(T t)
{
TryGetValue(t, out var list);
if (list != null && list.Count > 0)
{
return list[0];
}
return default;
}
public bool Contains(T t, K k)
{
TryGetValue(t, out var list);
if (list == null)
{
return false;
}
return list.Contains(k);
}
}
}