This repository has been archived on 2024-06-04. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
2023-08-10 09:04:36 +02:00

140 lines
2.9 KiB
C#

using Lookup.Interface;
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace Lookup.Abstract;
/// <summary>
/// Basic <see cref="ILookup{TKey,TValue}"/> implementation
/// </summary>
/// <typeparam name="TKey">Type of the key referencing the <typeparamref name="TValue"/>s</typeparam>
/// <typeparam name="TValue">Type of the stored values, referenced by <typeparamref name="TKey"/></typeparam>
public abstract class Lookup<TKey, TValue>
: Dictionary<TKey, ICollection<TValue>>,
ILookup<TKey, TValue>
where TKey : notnull
{
#region Constructor
/// <inheritdoc />
protected Lookup()
{
}
/// <inheritdoc />
protected Lookup(IDictionary<TKey, ICollection<TValue>> dictionary) : base(dictionary)
{
}
/// <inheritdoc />
protected Lookup(
IDictionary<TKey, ICollection<TValue>> dictionary, IEqualityComparer<TKey>? comparer
) : base(dictionary, comparer)
{
}
/// <inheritdoc />
protected Lookup(IEnumerable<KeyValuePair<TKey, ICollection<TValue>>> collection) :
base(collection)
{
}
/// <inheritdoc />
protected Lookup(
IEnumerable<KeyValuePair<TKey, ICollection<TValue>>> collection,
IEqualityComparer<TKey>? comparer
) : base(collection, comparer)
{
}
/// <inheritdoc />
protected Lookup(IEqualityComparer<TKey>? comparer) : base(comparer)
{
}
/// <inheritdoc />
protected Lookup(int capacity) : base(capacity)
{
}
/// <inheritdoc />
protected Lookup(int capacity, IEqualityComparer<TKey>? comparer) : base(capacity, comparer)
{
}
/// <inheritdoc />
protected Lookup(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
#endregion
#region Implementation of IDictionary<TKey,ICollection<TValue>>
/// <inheritdoc />
public void Add(TKey key, TValue value)
{
var collection = TryGetValue(key, out var values) ? values : Add(key);
collection.Add(value);
}
/// <inheritdoc />
public void AddRange(TKey key, IEnumerable<TValue> values)
{
var collection = TryGetValue(key, out var existingCollection)
? existingCollection
: Add(key);
foreach (var value in values)
{
collection.Add(value);
}
}
/// <inheritdoc />
public bool Remove(TKey key, TValue value)
{
if (!TryGetValue(key, out var values))
{
return false;
}
values.Remove(value);
return true;
}
/// <inheritdoc />
public ICollection<TValue> GetOrAdd(TKey key)
{
return TryGetValue(key, out var values)
? values
: Add(key);
}
#endregion
#region Implementation of ILookup<TKey,TValue>
/// <inheritdoc />
public abstract ICollection<TValue> Add(TKey key);
#endregion
#region Implementation of IDisposable
/// <inheritdoc cref="Dispose()"/>
protected virtual void Dispose(bool disposing)
{
}
/// <inheritdoc />
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
}