2009-07-23 7 views
7

Ho un MenuManager classe a cui ogni modulo può aggiungere una chiave e ed elemento ad essere caricato nel contenuto principale:Qual è la migliore raccolta C# con due chiavi e un oggetto?

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

Così il modulo cliente registra la sua vista in questo modo:

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

Così poi di portare una vista specifica per la parte anteriore dico:

layoutManager.ShowMainContentView("customer-help"); 

E per ottenere il vista predefinita (prima vista registrata), dico:

layoutManager.ShowDefaultView("customer"); 

E questo funziona bene.

Tuttavia, voglio eliminare il "codice di odore" con il trattino che separa il nome del modulo e vista nome, quindi vorrei registrare con questo comando:

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

Ma qual è il modo migliore per sostituire il mio attuale dizionario, ad es ciò che viene in mente sono questi:

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

La nuova collezione deve essere in grado di fare questo:

  • ottenere una vista con modulo e tasto di visualizzazione (ad es. "cliente", "aiuto" restituisce 1 visualizzazione)
  • ottiene una raccolta di tutte le viste in base alla chiave del modulo (ad es. "cliente" restituisce 5 visualizzazioni)

risposta

13

A rigor di soddisfare i vostri criteri, uso un 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

elegante in uso. – Will

+0

ha funzionato bene, grazie. –

+0

Se solo avessi visto un altro var lì ... – nawfal

1

Quello che stai descrivendo suona come una chiave composita nel dizionario, piuttosto che due tasti. Mi sento di raccomandare la creazione di una struttura semplice per rappresentare questa chiave:

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

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

Come menzionato in un similar thread, un buon modo per rappresentare un dizionario 2-chiave in .NET 4 è quello di utilizzare la classe Tuple:

IDictionary<Tuple<K1, K2>, V>