2009-07-23 17 views
7

Mam menuManager klasę, do której każdy moduł można dodać klucz oraz z elementem mają być załadowane do głównej treści:Jaki jest najlepszy C# kolekcji z dwóch kluczy i obiektu?

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

Więc moduł klient rejestruje swoje poglądy tak:

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

Więc potem przynieść konkretny widok do przodu mówię:

layoutManager.ShowMainContentView("customer-help"); 

I, aby uzyskać domyślny widok (pierwszy zarejestrowany widok), mówię:

layoutManager.ShowDefaultView("customer"); 

To działa dobrze.

Jednakże chcę, aby wyeliminować „zapachy kodu” z łącznikiem, który oddziela nazwę modułu i zobaczyć nazwisko, więc chciałbym zarejestrować z tym poleceniem:

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

ale co to jest najlepszym sposobem aby zastąpić mój obecny słownik, np co przychodzi na myśl, są takie:

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

Nowa kolekcja musi być w stanie to zrobić:

  • uzyskać widok z moduł i widok klucz (np „klient”, „pomoc” zwraca 1 view)
  • uzyskać kolekcję wszystkich poglądów przez klucz modułu (np "klient" zwraca 5 wyświetleń)

Odpowiedz

13

Ściśle spotkań kryteria, użyj 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

Elegant w użyciu. – Will

+0

działa dobrze, dziękuję. –

+0

Gdybym tylko widział jeszcze jeden var ... – nawfal

1

To, co opisujesz, brzmi jak klucz złożony w słowniku, a nie dwa klucze. Polecam utworzenie prostej struktury do reprezentowania tego klucza:

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

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

Jak wspomniano w similar thread, to dobry sposób, aby reprezentować 2-klucza słownika w .NET 4 jest użycie klasy Tuple:

IDictionary<Tuple<K1, K2>, V> 
Powiązane problemy