Существует ли Словарь <строка, объект> набор, который позволяет несколько ключей?

Единственный важный вопрос, "Как код более прост, лучше читаем, легче понять?" Если это более просто с несколькими возвратами, затем используйте их.

5
задан Edward Tanguay 27 July 2009 в 11:40
поделиться

7 ответов

Если вам нужно переменное количество значений для одного ключа, почему бы не создать Dictionary > ? Кроме того, вы можете унаследовать этот класс и создать свой собственный Add, получив тот же синтаксис, который вы используете сейчас. Таким образом вы можете избежать ручного добавления пустых списков перед добавлением нового элемента управления.

sth вроде этого:

class MultiValueDictionary<TKey, TValue> : Dictionary<TKey, List<TValue>>
{

   public void Add(TKey key, TValue value)
   {
      if(!ContainsKey(key))
         Add(key, new List<TValue>());
      this[key].Add(value);
   }
}
10
ответ дан 18 December 2019 в 06:12
поделиться

Ознакомьтесь с NGenerics ' HashList . Это словарь, в котором хранится список значений для каждого ключа. Библиотека Wintellect PowerCollections также имеет удобный класс MultiDictionary, который выполняет такие действия, как автоматическая очистка, когда вы удаляете последнее значение, связанное с данным ключом.

5
ответ дан 18 December 2019 в 06:12
поделиться

Как насчет того, чтобы сделать тип значения контейнера списком:

private Dictionary<string, List<UserControl>> _leftSubMenuItems =
    new Dictionary<string, List<UserControl>>();

if (!_leftSubMenuItems.ContainsKey("customers"))
{
    _leftSubMenuItems["customers"] = new List<UserControl>();
}
_leftSubMenuItems["customers"].Add(container.Resolve<EditCustomer>());
_leftSubMenuItems["customers"].Add(container.Resolve<CustomerReports>());
4
ответ дан 18 December 2019 в 06:12
поделиться

Нет, лучше встроенной коллекции нет. Я думаю, что ваша «естественная тенденция» идеально подходит для решения этой проблемы, поскольку на самом деле это не «одинаковые ключи», а уникальные ключи, состоящие из разных частей, и Dictionary выполняет свою работу. Вы также можете вложить словарь (имеет смысл, если у вас есть большое количество значений для каждого имени):

Dictionary<string, Dictionary<Type, object>> dict = ...;
var value = (T)dict[name][typeof(T)];

Этот подход разрешит элемент с помощью одного поиска в хеш-таблице. Если вы ведете список элементов для каждого элемента, вам придется линейно перемещаться по списку каждый раз, когда вам понадобится элемент для поиска, что в первую очередь лишает смысла использование Dictionary .

1
ответ дан 18 December 2019 в 06:12
поделиться

Я не знаю "MultiKeyDictionary". Я бы рекомендовал использовать структуру и переопределить GetHashCode, Equals и реализовать IEquatable (который используется Dictionary ).

0
ответ дан 18 December 2019 в 06:12
поделиться

Всего несколько настроек ...

public class MultiValueDictionary<TKey, TValue> : 
    Dictionary<TKey, List<TValue>>
{

    public void Add(TKey key, TValue value)
    {
        List<TValue> valList;
        //a single TryGetValue is quicker than Contains then []
        if (this.TryGetValue(key, out valList))
            valList.Add(value);
        else
            this.Add( key, new List<TValue> { value } );
    }

    //this can be simplified using yield 
    public IEnumerable<TValue> GetAllValues()
    {
        //dictionaries are already IEnumerable, you don't need the extra lookup
        foreach (var keyValPair in this)
            foreach(var val in keyValPair.Value);
                yield return val;
    }
}
3
ответ дан 18 December 2019 в 06:12
поделиться

Вы хотите хранить вместе несколько записей для одного ключа? Что-нибудь вроде , это ?

0
ответ дан 18 December 2019 в 06:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: