我有大約10,000條記錄。每個記錄有兩個字段:一個字段是長度最多300個字符的字符串,另一個字段是十進制值。這就像產品目錄中的產品名稱和每種產品的價格。我應該使用什麼類型的集合?
我需要做的是讓用戶輸入任何單詞,並將包含該單詞的所有產品連同其價格一起顯示在列表框中。就這樣。
- 什麼類型的集合最適合這種情況?
- 如果我需要根據產品名稱或價格進行排序,選擇是否仍然相同?
現在我正在使用一個XML文件,但我認爲使用集合,以便我可以嵌入代碼中的所有值更簡單。感謝您的建議。
我有大約10,000條記錄。每個記錄有兩個字段:一個字段是長度最多300個字符的字符串,另一個字段是十進制值。這就像產品目錄中的產品名稱和每種產品的價格。我應該使用什麼類型的集合?
我需要做的是讓用戶輸入任何單詞,並將包含該單詞的所有產品連同其價格一起顯示在列表框中。就這樣。
現在我正在使用一個XML文件,但我認爲使用集合,以便我可以嵌入代碼中的所有值更簡單。感謝您的建議。
A Dictionary將完成這項工作。但是,如果您正在進行快速部分匹配(例如,搜索爲用戶類型),則可以通過創建指向同一項目的多個鍵來獲得更好的性能。例如,「Apple」這個詞可能位於「Ap」,「App」,「Appl」和「Apple」。
我已經在類似數量的記錄上使用了這種方法,結果非常好。我已將我的10K源項目轉換爲大約50K個唯一密鑰。這些詞條中的每一個都指向一個列表,其中包含對該詞所有匹配的引用。然後,您可以更有效地搜索這個小得多的列表。儘管創建了大量的列表,但內存佔用是相當合理的。
如果需要,您還可以自行組成自己的密鑰,以重定向常見拼寫錯誤或指向相關項目。這也消除了大多數使用唯一鍵的問題,因爲每個鍵都指向一個列表。單個項目可以按其名稱中的每個單詞進行分類;如果您的產品名稱很長且包含多個單詞,這非常有用。分類項目時,名稱中的每個單詞都可以映射到一個或多個密鑰。
我還應該指出,建設和分類10K項目不應該花很長時間,如果正確完成(幾百毫秒是合理的)。只要您想使用Application
,Cache
或靜態成員,結果就可以被緩存。
總而言之,得到的結構是一個Dictionary<string, List<T>>
,其中字符串是一個短的(2-6個字符效果很好),但是是唯一的鍵。每個關鍵點指向List<T>
(或其他集合,如果您如此傾向)與該關鍵字匹配的項目。執行搜索時,您可以找到與用戶提供的術語相匹配的關鍵字。根據您的密鑰長度,您可能會將用戶的搜索截斷爲最大密鑰長度。找到正確的子集合後,您可以使用您希望的任何方法搜索該集合以進行完整或部分匹配。
最後,您可能希望爲列表中的每個項目創建一個輕量級結構,以便您可以存儲有關該項目的其他信息。例如,您可以創建一個小的Product類,它存儲產品的名稱,價格,部門和流行度。這可以幫助您優化顯示給用戶的結果。
總而言之,您可以實時執行智能,詳細,模糊的搜索。
上述結構應提供大致相當於trie的功能。
+1用於提示Product類,展示部分匹配的方法並花時間寫出有用答案 – Adam 2011-12-24 10:05:19
請不要在標題中放置C#。這就是標籤的用途。 – Amy 2011-12-24 08:13:56
不是集合:您可以使用SQLLite存儲數據並訪問它。 – 2011-12-24 08:39:11