Dictionary<TKey,TValue> со многими одинаковыми TKey
От: HotDog Швейцария www.denebspace.com
Дата: 07.07.09 08:36
Оценка:
Нужен generic класс подобный Dictionary но допускающий наличие нескольких элементов с одинаковым ключом.
Есть ли во фреймворке уже что то готовое?
Re: Dictionary<TKey,TValue> со многими одинаковыми TKey
От: samius Япония http://sams-tricks.blogspot.com
Дата: 07.07.09 08:47
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Нужен generic класс подобный Dictionary но допускающий наличие нескольких элементов с одинаковым ключом.

HD>Есть ли во фреймворке уже что то готовое?

System.Linq.Lookup&lt;TKey, TElement&gt;
Re: Dictionary<TKey,TValue> со многими одинаковыми TKey
От: _Dreamer Россия  
Дата: 07.07.09 08:48
Оценка: 7 (2)
Здравствуйте, HotDog, Вы писали:

HD>Нужен generic класс подобный Dictionary но допускающий наличие нескольких элементов с одинаковым ключом.

HD>Есть ли во фреймворке уже что то готовое?

PowerCollections::MuliDictionary ?
PowerCollections
Re: Dictionary<TKey,TValue> со многими одинаковыми TKey
От: _FRED_ Черногория
Дата: 07.07.09 09:16
Оценка: 14 (4) +1
Здравствуйте, 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-ом и тому подобные изменения. ИМХО, такой вариант намного легковеснее и расширяймее.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Dictionary<TKey,TValue> со многими одинаковыми TKey
От: HotDog Швейцария www.denebspace.com
Дата: 07.07.09 09:50
Оценка:
Здравствуйте, samius, Вы писали:

S>System.Linq.Lookup&lt;TKey, TElement&gt;


Забыл сказать, что сижу на втором фреймворке. Но все равно спасибо!
Re[2]: Dictionary<TKey,TValue> со многими одинаковыми TKey
От: _FRED_ Черногория
Дата: 07.07.09 16:48
Оценка:
Здравствуйте, _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>    }
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Dictionary<TKey,TValue> со многими одинаковыми TKey
От: Silver_s Ниоткуда  
Дата: 07.07.09 19:43
Оценка:
Здравствуйте, samius, Вы писали:

HD>>Есть ли во фреймворке уже что то готовое?

S>System.Linq.Lookup&lt;TKey, TElement&gt;

Вот только он readonly. И единственный способ создать .ToLookup()
Re[3]: Dictionary<TKey,TValue> со многими одинаковыми TKey
От: samius Япония http://sams-tricks.blogspot.com
Дата: 07.07.09 19:55
Оценка:
Здравствуйте, Silver_s, Вы писали:

S_>Здравствуйте, samius, Вы писали:


HD>>>Есть ли во фреймворке уже что то готовое?

S>>System.Linq.Lookup&lt;TKey, TElement&gt;

S_>Вот только он readonly. И единственный способ создать .ToLookup()


Значит велосипед нужен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.