Просто чтобы добавить свои 0,02 доллара в коллекцию решений:
У меня была такая же потребность еще в 2011 году, и я создал MultiDictionary
с педантично полной реализацией всех интерфейсов .NET.Это включает в себя перечислители, которые возвращают стандарт KeyValuePair<K, T>
и поддержку свойства IDictionary<K, T>.Values
, обеспечивающего набор фактических значений (вместо ICollection<ICollection<T>>
).
Таким образом, он аккуратно вписывается в остальную частьклассы .NET коллекции.Я также определил интерфейс IMultiDictionary<K, T>
для доступа к операциям, которые являются специфическими для этого вида словаря:
public interface IMultiDictionary<TKey, TValue> :
IDictionary<TKey, ICollection<TValue>>,
IDictionary,
ICollection<KeyValuePair<TKey, TValue>>,
IEnumerable<KeyValuePair<TKey, TValue>>,
IEnumerable {
/// <summary>Adds a value into the dictionary</summary>
/// <param name="key">Key the value will be stored under</param>
/// <param name="value">Value that will be stored under the key</param>
void Add(TKey key, TValue value);
/// <summary>Determines the number of values stored under a key</summary>
/// <param name="key">Key whose values will be counted</param>
/// <returns>The number of values stored under the specified key</returns>
int CountValues(TKey key);
/// <summary>
/// Removes the item with the specified key and value from the dictionary
/// </summary>
/// <param name="key">Key of the item that will be removed</param>
/// <param name="value">Value of the item that will be removed</param>
/// <returns>True if the item was found and removed</returns>
bool Remove(TKey key, TValue value);
/// <summary>Removes all items of a key from the dictionary</summary>
/// <param name="key">Key of the items that will be removed</param>
/// <returns>The number of items that have been removed</returns>
int RemoveKey(TKey key);
}
Он может быть скомпилирован на любом, начиная с .NET 2.0 и выше, и до сих пор я развертывал его наXbox 360, Windows Phone 7, Linux и Unity 3D.Существует также полный набор модульных тестов, охватывающий каждую строку кода.
Код лицензируется в соответствии с Common Public License (коротко: все идет, но исправления ошибок в коде библиотеки имеютопубликовано) и может быть найдено в моем хранилище Subversion .