2009-07-23 3 views
7

У меня MenuManager класс, к которому каждый модуль может добавить ключ и и элемент, который будет загружен в основное содержание:Какая лучшая коллекция C# с двумя ключами и объектом?

private Dictionary<string,object> _mainContentItems = new Dictionary<string,object>(); 
public Dictionary<string,object> MainContentItems 
{ 
    get { return _mainContentItems; } 
    set { _mainContentItems = value; } 
} 

Таким образом, модуль клиент регистрирует свои взгляды как это:

layoutManager.MainContentViews.Add("customer-help", this.container.Resolve<HelpView>()); 
layoutManager.MainContentViews.Add("customer-main", this.container.Resolve<MainView>()); 

Так потом принести конкретный вид спереди я говорю:

layoutManager.ShowMainContentView("customer-help"); 

И чтобы получить (вид сверху зарегистрирован), я говорю:

layoutManager.ShowDefaultView("customer"); 

И это отлично работает.

Однако, я хочу, чтобы устранить «код запах» с дефисом, который отделяет имя модуля и просматривать имя, поэтому я хотел бы зарегистрировать с помощью этой команды:

layoutManager.MainContentViews.Add("customer","help", this.container.Resolve<HelpView>()); 

Но что это лучший способ заменить мой текущий словарь, например что приходит на ум, это:

  • Dictionary<string, string, object> (doesn't exist)
  • Dictionary<KeyValuePair<string,string>, object>
  • Dictionary<CUSTOM_STRUCT, object>

Новая коллекция должна быть в состоянии сделать это:

  • получить вид с модуль и ключ просмотра (например, «клиент», «помощь» возвращает 1 вид)
  • получить коллекцию всех представлений с помощью ключа модуля (например, «клиент» возвращает 5 просмотров)

ответ

13

Строго отвечающий Вашим критериям, используйте Dictionary<string, Dictionary<string, object>>;

var dict = new Dictionary<string, Dictionary<string, object>>(); 
... 
object view = dict["customer"]["help"]; 
Dictionary<string, object>.ValueCollection views = dict["customer"].Values; 
+0

Элегантный в использовании. – Will

+0

работал хорошо, спасибо. –

+0

Если бы я видел еще один вар там ... – nawfal

1

То, что вы описываете, похоже на составной ключ в словаре, а не на два ключа. Я хотел бы рекомендовать создание простой структуры, чтобы представить этот ключ:

struct Section { 
    string Area { get; set; } 
    string Area2 { get; set; } 

    // override ToHashCode, Equals and implement IComparable. 
} 
4

Как уже упоминалось в similar thread, хороший способ представления 2-ключа словаря в .NET 4 является использование Tuple класс:

IDictionary<Tuple<K1, K2>, V> 

 Смежные вопросы

  • Нет связанных вопросов^_^