Add key collection to weak dictionary and compact code
This commit is contained in:
parent
2db7b607f0
commit
3eecdf2cf5
1 changed files with 44 additions and 79 deletions
|
@ -7,7 +7,7 @@ namespace TechbloxModdingAPI.Utility
|
||||||
{
|
{
|
||||||
public class WeakDictionary<TKey, TValue> : IDictionary<TKey, TValue> where TValue : class
|
public class WeakDictionary<TKey, TValue> : IDictionary<TKey, TValue> where TValue : class
|
||||||
{
|
{
|
||||||
private Dictionary<TKey, WeakReference<TValue>> _dictionary = new Dictionary<TKey, WeakReference<TValue>>();
|
private readonly Dictionary<TKey, WeakReference<TValue>> _dictionary = new();
|
||||||
|
|
||||||
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
|
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
|
||||||
{
|
{
|
||||||
|
@ -19,53 +19,19 @@ namespace TechbloxModdingAPI.Utility
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerator IEnumerable.GetEnumerator()
|
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
||||||
{
|
public void Add(KeyValuePair<TKey, TValue> item) => Add(item.Key, item.Value);
|
||||||
return GetEnumerator();
|
public void Clear() => _dictionary.Clear();
|
||||||
}
|
public bool Contains(KeyValuePair<TKey, TValue> item) =>
|
||||||
|
TryGetValue(item.Key, out var value) && item.Value == value;
|
||||||
public void Add(KeyValuePair<TKey, TValue> item)
|
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex) =>
|
||||||
{
|
|
||||||
Add(item.Key, item.Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Clear()
|
|
||||||
{
|
|
||||||
_dictionary.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Contains(KeyValuePair<TKey, TValue> item)
|
|
||||||
{
|
|
||||||
return TryGetValue(item.Key, out var value) && item.Value == value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
|
|
||||||
{
|
|
||||||
throw new System.NotImplementedException();
|
throw new System.NotImplementedException();
|
||||||
}
|
public bool Remove(KeyValuePair<TKey, TValue> item) => Contains(item) && Remove(item.Key);
|
||||||
|
|
||||||
public bool Remove(KeyValuePair<TKey, TValue> item)
|
|
||||||
{
|
|
||||||
return Contains(item) && Remove(item.Key);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int Count => _dictionary.Count;
|
public int Count => _dictionary.Count;
|
||||||
public bool IsReadOnly => false;
|
public bool IsReadOnly => false;
|
||||||
|
public bool ContainsKey(TKey key) => TryGetValue(key, out _);
|
||||||
public bool ContainsKey(TKey key)
|
public void Add(TKey key, TValue value) => _dictionary.Add(key, new WeakReference<TValue>(value));
|
||||||
{
|
public bool Remove(TKey key) => _dictionary.Remove(key);
|
||||||
return TryGetValue(key, out _);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Add(TKey key, TValue value)
|
|
||||||
{
|
|
||||||
_dictionary.Add(key, new WeakReference<TValue>(value));
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Remove(TKey key)
|
|
||||||
{
|
|
||||||
return _dictionary.Remove(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool TryGetValue(TKey key, out TValue value)
|
public bool TryGetValue(TKey key, out TValue value)
|
||||||
{
|
{
|
||||||
|
@ -83,12 +49,37 @@ namespace TechbloxModdingAPI.Utility
|
||||||
set => _dictionary[key] = new WeakReference<TValue>(value);
|
set => _dictionary[key] = new WeakReference<TValue>(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ICollection<TKey> Keys => _dictionary.Keys;
|
public ICollection<TKey> Keys => new KeyCollection(this);
|
||||||
public ICollection<TValue> Values => new ValueCollection(this);
|
public ICollection<TValue> Values => new ValueCollection(this);
|
||||||
|
|
||||||
|
public class KeyCollection : ICollection<TKey>, IReadOnlyCollection<TKey>
|
||||||
|
{
|
||||||
|
private readonly WeakDictionary<TKey, TValue> _dictionary;
|
||||||
|
internal KeyCollection(WeakDictionary<TKey, TValue> dictionary)
|
||||||
|
{
|
||||||
|
_dictionary = dictionary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerator<TKey> GetEnumerator()
|
||||||
|
{
|
||||||
|
using var enumerator = _dictionary.GetEnumerator();
|
||||||
|
while (enumerator.MoveNext())
|
||||||
|
yield return enumerator.Current.Key;
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
||||||
|
public void Add(TKey item) => throw new NotSupportedException("The key collection is read only.");
|
||||||
|
public void Clear() => throw new NotSupportedException("The key collection is read only.");
|
||||||
|
public bool Contains(TKey item) => _dictionary.ContainsKey(item);
|
||||||
|
public void CopyTo(TKey[] array, int arrayIndex) => throw new NotImplementedException();
|
||||||
|
public bool Remove(TKey item) => throw new NotSupportedException("The key collection is read only.");
|
||||||
|
public int Count => _dictionary.Count;
|
||||||
|
public bool IsReadOnly => true;
|
||||||
|
}
|
||||||
|
|
||||||
public class ValueCollection : ICollection<TValue>, IReadOnlyCollection<TValue>
|
public class ValueCollection : ICollection<TValue>, IReadOnlyCollection<TValue>
|
||||||
{
|
{
|
||||||
private WeakDictionary<TKey, TValue> _dictionary;
|
private readonly WeakDictionary<TKey, TValue> _dictionary;
|
||||||
internal ValueCollection(WeakDictionary<TKey, TValue> dictionary)
|
internal ValueCollection(WeakDictionary<TKey, TValue> dictionary)
|
||||||
{
|
{
|
||||||
_dictionary = dictionary;
|
_dictionary = dictionary;
|
||||||
|
@ -98,41 +89,15 @@ namespace TechbloxModdingAPI.Utility
|
||||||
{
|
{
|
||||||
using var enumerator = _dictionary.GetEnumerator();
|
using var enumerator = _dictionary.GetEnumerator();
|
||||||
while (enumerator.MoveNext())
|
while (enumerator.MoveNext())
|
||||||
{
|
|
||||||
yield return enumerator.Current.Value;
|
yield return enumerator.Current.Value;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
IEnumerator IEnumerable.GetEnumerator()
|
|
||||||
{
|
|
||||||
return GetEnumerator();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Add(TValue item)
|
|
||||||
{
|
|
||||||
throw new NotSupportedException("The value collection is read only.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Clear()
|
|
||||||
{
|
|
||||||
throw new NotSupportedException("The value collection is read only.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Contains(TValue item)
|
|
||||||
{
|
|
||||||
return _dictionary.Any(kv => kv.Value == item);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CopyTo(TValue[] array, int arrayIndex)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Remove(TValue item)
|
|
||||||
{
|
|
||||||
throw new NotSupportedException("The value collection is read only.");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
||||||
|
public void Add(TValue item) => throw new NotSupportedException("The value collection is read only.");
|
||||||
|
public void Clear() => throw new NotSupportedException("The value collection is read only.");
|
||||||
|
public bool Contains(TValue item) => _dictionary.Any(kv => kv.Value == item);
|
||||||
|
public void CopyTo(TValue[] array, int arrayIndex) => throw new NotImplementedException();
|
||||||
|
public bool Remove(TValue item) => throw new NotSupportedException("The value collection is read only.");
|
||||||
public int Count => _dictionary.Count;
|
public int Count => _dictionary.Count;
|
||||||
public bool IsReadOnly => true;
|
public bool IsReadOnly => true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue