Единственный важный вопрос, "Как код более прост, лучше читаем, легче понять?" Если это более просто с несколькими возвратами, затем используйте их.
Если вам нужно переменное количество значений для одного ключа, почему бы не создать 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);
}
}
Ознакомьтесь с NGenerics ' HashList . Это словарь, в котором хранится список значений для каждого ключа. Библиотека Wintellect PowerCollections также имеет удобный класс MultiDictionary, который выполняет такие действия, как автоматическая очистка, когда вы удаляете последнее значение, связанное с данным ключом.
Как насчет того, чтобы сделать тип значения контейнера списком:
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>());
Нет, лучше встроенной коллекции нет. Я думаю, что ваша «естественная тенденция» идеально подходит для решения этой проблемы, поскольку на самом деле это не «одинаковые ключи», а уникальные ключи, состоящие из разных частей, и Dictionary
выполняет свою работу. Вы также можете вложить словарь (имеет смысл, если у вас есть большое количество значений для каждого имени):
Dictionary<string, Dictionary<Type, object>> dict = ...;
var value = (T)dict[name][typeof(T)];
Этот подход разрешит элемент с помощью одного поиска в хеш-таблице. Если вы ведете список элементов для каждого элемента, вам придется линейно перемещаться по списку каждый раз, когда вам понадобится элемент для поиска, что в первую очередь лишает смысла использование Dictionary
.
Я не знаю "MultiKeyDictionary". Я бы рекомендовал использовать структуру и переопределить GetHashCode, Equals и реализовать IEquatable
Всего несколько настроек ...
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;
}
}
Вы хотите хранить вместе несколько записей для одного ключа? Что-нибудь вроде , это ?