Где я могу найти хорошую реализацию IDictionary
который использует слабые ссылки внутри?
Словарь должен содержать только слабые ссылки на значения и в конечном счете мыться мертвых ссылок.
Или я должен просто записать это сам?
Вам придется написать его самостоятельно. Это должно быть относительно просто: реализуйте интерфейс IDictionary, а затем храните фактические значения как WeakReferences. Затем вы можете проверять значения при добавлении/выборе, чтобы убедиться, что они все еще живы.
Псевдокод - на самом деле не компилируется:
public class WeakDictionary <TKey,TValue> : IDictionary<TKey,TValue>
{
private IDictionary<TKey,WeakReference> _innerDictionary = new Dictionary<TKey,WeakReference>();
public TValue Index[ TKey key ]
{
get{
var reference = _innerDictionary[ key ];
if( reference.IsAlive )
return (TValue)reference.Target;
throw new InvalidOperation( "Key not found." );
}
}
private void Cull()
{
var deadKeys = new List<TKey>();
foreach( var pair in _innerDictionary )
{
if( ! pair.Value.IsAlive )
deadKeys.Add( pair.Key );
}
foreach( var key in deadKeys )
_innerDictionary.Remove( key );
}
}