namespace ASC.Core; public class UserGroupRefDictionary : IDictionary { private readonly IDictionary _dict = new Dictionary(); private IDictionary> _byUsers; private IDictionary> _byGroups; public int Count => _dict.Count; public bool IsReadOnly => _dict.IsReadOnly; public ICollection Keys => _dict.Keys; public ICollection Values => _dict.Values; public UserGroupRef this[string key] { get => _dict[key]; set { _dict[key] = value; BuildIndexes(); } } public UserGroupRefDictionary(IDictionary dic) { foreach (var p in dic) { _dict.Add(p); } BuildIndexes(); } public void Add(string key, UserGroupRef value) { _dict.Add(key, value); BuildIndexes(); } public void Add(KeyValuePair item) { _dict.Add(item); BuildIndexes(); } public bool Remove(string key) { var result = _dict.Remove(key); BuildIndexes(); return result; } public bool Remove(KeyValuePair item) { var result = _dict.Remove(item); BuildIndexes(); return result; } public void Clear() { _dict.Clear(); BuildIndexes(); } public bool TryGetValue(string key, out UserGroupRef value) { return _dict.TryGetValue(key, out value); } public bool ContainsKey(string key) { return _dict.ContainsKey(key); } public bool Contains(KeyValuePair item) { return _dict.Contains(item); } public void CopyTo(KeyValuePair[] array, int arrayIndex) { _dict.CopyTo(array, arrayIndex); } public IEnumerator> GetEnumerator() { return _dict.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)_dict).GetEnumerator(); } public IEnumerable GetByUser(Guid userId) { return _byUsers.ContainsKey(userId) ? _byUsers[userId].ToList() : new List(); } public IEnumerable GetByGroups(Guid groupId) { return _byGroups.ContainsKey(groupId) ? _byGroups[groupId].ToList() : new List(); } private void BuildIndexes() { _byUsers = _dict.Values.GroupBy(r => r.UserId).ToDictionary(g => g.Key, g => g.AsEnumerable()); _byGroups = _dict.Values.GroupBy(r => r.GroupId).ToDictionary(g => g.Key, g => g.AsEnumerable()); } }