【发布时间】:2012-03-07 09:54:49
【问题描述】:
我有一个结构可以很容易地使用三层嵌套字典来表示,就像这样
private static Dictionary<string, Dictionary<string, Dictionary<string,string>>> PrerenderedTemplates;
这种结构可能会用到这样的地方
PrerenderedTemplates[instanceID][templategroup][templatepart]
现在,我意识到这段代码很难阅读,因为通过查看定义语句,您无法判断它的用途。将其更改为Dictionary<string, PrerenderedTemplate> 时我真正看到的唯一优势是可读性。将每个嵌套转换为自己的类(例如class PrerenderedTemplate{} class TemplateGroup{} class TemplatePart{})将添加更多代码行,但计算优势很小(如果有的话)。据我所知。
- 那么,我的方法“可以”还是应该加倍努力并创建单独的课程?
- 是否可以在文档/cmets 中介绍嵌套
Dictionary的工作原理 - 有处理这种嵌套的最佳做法吗?
- 请记住,这是一个私有成员,对于使用该类的人来说,它不需要直截了当。
更新
因此,受 Reza 的启发,但无法使用元组,我决定创建自己的密钥生成器并像这样实现他的模式:
private Dictionary<string, string> PrerenderedTemplates;
private string GetPrerenderedTemplateKey(string InstanceId, string FeatureId, string OptionId)
{
return new StringBuilder(instanceId)
.Append(FormatTools.LIST_ENTRY_DELIMITER)
.Append(templategroup)
.Append(FormatTools.LIST_ENTRY_DELIMITER)
.Append(templatepart).ToString();
}
其中FormatTools.LIST_ENTRY_DELIMITER 是Unicode 专用字符0xe04d。
【问题讨论】:
-
由于前两个嵌套本质上只是标识符,也许我可以使用简单的 Dictionary
。所以 PrerenderedTemplates["instance1"]["fruit"]["banana"]可以只表示为PrerenderedTemplates["instance1_fruit_banana"],就像命名空间一样。 -
您是否需要能够使用
PrerenderedTemplates来列出您的模板组或模板部分?有点像PrerenderedTemplates[instanceID].Keys或PrerenderedTemplates[instanceID][templateGroup]?如果是这样,那么这可能是处理它的最简单方法。 -
@M.Babcock,好吧,我正在循环一个对象集合,这些对象包含指向如何呈现模板的元数据。在渲染该模板之前,我想检查我的字典以确保它之前没有被渲染过。如果没有,我会渲染它并将结果添加到我的字典中。 (模板变更管理在别处处理)
-
@Iain Fraser 我喜欢您的第一个选项,其中包含您不允许在键语言中作为分隔符的特殊字符。我过去做过,它对我有用。
标签: c# oop data-structures dictionary