using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; class WeakHashSet where T: class { readonly ConditionalWeakTable table = new ConditionalWeakTable(); private readonly List> lst = new List>(); static object value = new object(); public bool Contains(T obj) => table.TryGetValue(obj, out var _); public bool Add(T obj) { if (table.TryGetValue(obj, out var _)) return false; table.Add(obj, value); var free = lst.FirstOrDefault(x => x.TryGetTarget(out _) == false); if(free != null) free.SetTarget(obj); else lst.Add(new WeakReference(obj)); return true; } public IEnumerable GetElements() { foreach (var item in lst) { if (item.TryGetTarget(out T x)) yield return x; } } }