using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; namespace Masuit.Tools.Systems; public class LookupX : IEnumerable> { private readonly IDictionary> _dictionary; public LookupX(Dictionary> dic) { _dictionary = dic; } public LookupX(ConcurrentDictionary> dic) { _dictionary = dic; } public IEnumerator> GetEnumerator() { return _dictionary.Select(pair => new Grouping(pair.Key, pair.Value)).GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public bool Contains(TKey key) { return _dictionary.ContainsKey(key); } public int Count => _dictionary.Count; public List this[TKey key] => _dictionary.TryGetValue(key, out var value) ? value : new List(); } public class Grouping : IEnumerable { private readonly List _list; internal Grouping(TKey key, List list) { Key = key; _list = list; } public IEnumerator GetEnumerator() { return _list.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public TKey Key { get; } public void Deconstruct(out TKey key, out IEnumerable elements) { key = Key; elements = _list; } }