Нужен generic класс подобный Dictionary но допускающий наличие нескольких элементов с одинаковым ключом.
Есть ли во фреймворке уже что то готовое?
Здравствуйте, HotDog, Вы писали:
HD>Нужен generic класс подобный Dictionary но допускающий наличие нескольких элементов с одинаковым ключом.
HD>Есть ли во фреймворке уже что то готовое?
System.Linq.Lookup<TKey, TElement>
Здравствуйте, HotDog, Вы писали:
HD>Нужен generic класс подобный Dictionary но допускающий наличие нескольких элементов с одинаковым ключом.
HD>Есть ли во фреймворке уже что то готовое?
PowerCollections::MuliDictionary ?
PowerCollections
Здравствуйте, HotDog, Вы писали:
HD>Нужен generic класс подобный Dictionary но допускающий наличие нескольких элементов с одинаковым ключом.
HD>Есть ли во фреймворке уже что то готовое?
Если не подойдут сторонние коллекции, то можно обойтись Dictionary<TKey,
IList<TValue
>>:
static class MultiDictionary
{
public static IDictionary<TKey, IList<TValue>> Create<TKey, TValue>(int capacity, IEqualityComparer<TKey> comparer) {
return new Dictionary<TKey, IList<TValue>>(capacity, comparer);
}
public static IList<TValue> Add<TKey, TValue>(this IDictionary<TKey, IList<TValue>> dictionary, TKey key, TValue value) {
Contract.Requires(dictionary != null);
IList<TValue> list;
if(!dictionary.TryGetValue(key, out list)) {
dictionary.Add(key, list = new List<TValue>());
}//if
list.Add(value);
return list;
}
public static bool Remove<TKey, TValue>(this IDictionary<TKey, IList<TValue>> dictionary, TKey key, TValue value) {
Contract.Requires(dictionary != null);
IList<TValue> list;
return dictionary.TryGetValue(key, out list) && list != null && list.Remove(value);
}
public static bool Contains<TKey, TValue>(this IDictionary<TKey, IList<TValue>> dictionary, TKey key, TValue value) {
Contract.Requires(dictionary != null);
IList<TValue> list;
return dictionary.TryGetValue(key, out list) && list != null && list.Contains(value);
}
}
Но это для примера. Иногда требуется, что бы "внутренний" список был HashSet-ом и тому подобные изменения. ИМХО, такой вариант намного легковеснее и расширяймее.
Здравствуйте, samius, Вы писали:
S>System.Linq.Lookup<TKey, TElement>
Забыл сказать, что сижу на втором фреймворке. Но все равно спасибо!
Здравствуйте, _FRED_, Вы писали:
Remove должен быть таким:
_FR> public static bool Remove<TKey, TValue>(this IDictionary<TKey, IList<TValue>> dictionary, TKey key, TValue value) {
_FR> Contract.Requires(dictionary != null);
_FR> IList<TValue> list;
if(dictionary.TryGetValue(key, out list) && list != null && list.Remove(value)) {
if(list.Count == 0) {
dictionary.Remove(key);
}//if
return true;
}//if
return false;
_FR> }
Здравствуйте, samius, Вы писали:
HD>>Есть ли во фреймворке уже что то готовое?
S>System.Linq.Lookup<TKey, TElement>
Вот только он readonly. И единственный способ создать .ToLookup()
Здравствуйте, Silver_s, Вы писали:
S_>Здравствуйте, samius, Вы писали:
HD>>>Есть ли во фреймворке уже что то готовое?
S>>System.Linq.Lookup<TKey, TElement>
S_>Вот только он readonly. И единственный способ создать .ToLookup()
Значит велосипед нужен