2017-10-05 336 views
0

我创建了一个处理不同上下文(例如:常规上下文,菜单上下文,游戏上下文等)文本的文本管理器类。C#在字典中搜索字典的最快方法

每个上下文是使用二进制文本文件创建,并将数据存储在字典中的字典中是这样的:

private Dictionary<string, Dictionary<string, string>> m_TextContexs; 

哪像这样工作的:

m_TextContexs[context][textID][actual text] 

我想用户在这样的功能中发现只有'textID'字符串的任何文本行:

public string GetText(string id) 

编辑:textIDs是唯一的,因为相同的textID不会在多个上下文中存在。

所以这个函数应该在所有现有的上下文中找到字符串id并返回有效的实际文本。

这里的问题是,什么是做这个操作的最快方法。我不是一个有经验的程序员,所以我要做的就是遍历所有的上下文,并查看每个上下文,如果它提到的文本ID存在。

如果您想知道为什么我需要'上下文'来分组文本,所以如果不再需要上下文,我可以从内存中卸载该数据。

提前感谢:)

+0

您能否提供一个更好的例子来说明“字典中的字典”是什么意思? – NightOwl888

+0

另外,您认为最快的是什么?性能?花时间编码?其他考虑如内存使用情况等呢? – AndrewP

+0

NightOwl888通过在词典中的字典中搜索我的意思是我在上面为对象m_TextContexts所写的行。主要字典的关键是许多上下文像c1,c2,c3等......在每个上下文中都有一个包含实际的文本对的字典。因此,例如textID“id001”可以在主词典的任何键中。但它是独一无二的(因为它在不同的环境下不会重复)。 – Cris

回答

4

从字典中键O(1)时间检索值,这意味着几乎瞬间,所以这个问题真的取决于什么样的动物你context是,如何独特textId是。

你怎么知道哪个环境是“正确的”?你能从用户的当前位置和应用程序内的路径中确定这一点吗?如果是这样,那么你可以通过的值来查找函数。

否则,通过上下文循环将无济于事,除非textId在上下文中是唯一的。例如,给出textId 123,您如何知道您是要m_TextContexs[context1][123]还是m_TextContexs[context2][123]

如果textId唯一横跨上下文(最好的情况下),那么你可以简单地消除画面context,并使用Dictionary<string, string>textId是唯一的关键。

+1

如果textId是唯一的,但上下文也很重要,可能会翻转原始字典,使其具有textId作为键,以及具有上下文/文本作为值的结构/类,这意味着您仍然可以通过给定上下文轻松地找到所有值根据值做一个linq查询 – AndrewP

+0

感谢Paul Smith,我是一个白痴,我没有在多个上下文中考虑过相同的ID。当我从Excel文件中导出所有文本时,我将确保ID是唯一的。假设这一点,AndrewP关于翻转原始字典的观点是有道理的。非常感谢你们! – Cris

+0

保罗史密斯和安德鲁 - 我仍然不确定什么是最好的和最快的(性能明智)来实现这个算法。假设textID是唯一的,我想避免将主键作为textID,然后将值作为具有实际文本字符串和上下文字符串的结构或类,因为这意味着上下文在文本内存中的次数与文本的次数相同在字典里面,似乎浪费了记忆。我想保留上下文,所以当我想由于文本不再需要而卸载上下文时,我可以通过在主词典中释放上下文关键字来快速完成上下文。 – Cris