chr
2026-04-05 fe750b791d5b517cc4e9bc8e99a9a75139a0cfba
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
 
class WeakHashSet<T> where T: class
{
    readonly ConditionalWeakTable<T, object> table = new ConditionalWeakTable<T, object>();
 
    private readonly List<WeakReference<T>> lst = new List<WeakReference<T>>(); 
    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<T>(obj));
        return true;
    }
 
    public IEnumerable<T> GetElements()
    {
        foreach (var item in lst)
        {
            if (item.TryGetTarget(out T x))
                yield return x;
        }
    }
}