有两个键和一个对象的最佳C#集合是什么?

时间:2009-07-23 13:44:37

标签: c# wpf collections prism

我有一个 MenuManager 类,每个模块都可以在其中添加一个键和要加载到主要内容中的元素:

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>

新系列需要能够做到这一点:

  • 使用模块和视图键获取视图(例如“customer”,“help”返回1视图)
  • 按模块键获取所有视图的集合(例如“customer”返回5个视图)

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:4)

similar thread中所述,在.NET 4中表示2键字典的好方法是使用Tuple类:

IDictionary<Tuple<K1, K2>, V>

答案 2 :(得分:1)

您所描述的内容听起来像是字典中的复合键,而不是两个键。我建议设置一个简单的结构来表示这个键:

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

   // override ToHashCode, Equals and implement IComparable.
}