2017-10-05 83 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