Создать словарь на лету с оператором [] - PullRequest
6 голосов
/ 07 июня 2011

Обычно, когда вы создаете Dictionary<Tkey, TValue>, вы должны сначала пойти и добавить пары k / v, вызвав add в самом словаре.

У меня есть Dictionary<string, mycontainer>, где mycontainer - это контейнер других объектов. Мне нужно иметь возможность быстро добавлять вещи в mycontainer, поэтому я подумал, что, возможно, я смогу перегрузить индекс operator[], чтобы создать mycontainer на лету, если он еще не существует, и затем позволить мне вызывать add на него напрямую , как таковой:

mydictionnary["SomeName"].Add(myobject); без явной необходимости создавать mycontainer каждый раз, когда контейнер с таким именем не существует в словаре.

Я задавался вопросом, является ли это хорошей идеей или я должен явно создавать новые объекты mycontainer?

Ответы [ 3 ]

5 голосов
/ 07 июня 2011

Вы должны создать свой собственный класс, который обернет Dictionary<TKey, List<TItem>>.

Индексатор будет выглядеть так:

public List<TItem> this[TKey key] {
    get {
        List<TItem> retVal;
        if (!dict.TryGetValue(key, out retVal))
            dict.Add(key, (retVal = new List<TItem>(itemComparer)));
        return retVal;
    }
}
1 голос
/ 07 июня 2011

Можно также сделать myCustomClass.Add( key, subkey, value );, чтобы код можно было легко понять, и intellisense будет направлять его использование.

0 голосов
/ 07 июня 2011

Я бы пошел на явный код - неявная перегрузка индексатора на самом деле не является распространенной ситуацией и, вероятно, через несколько месяцев будет кусаться, когда кто-то другой будет читать ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...