2011-12-24 77 views
7

我有大約10,000條記錄。每個記錄有兩個字段:一個字段是長度最多300個字符的字符串,另一個字段是十進制值。這就像產品目錄中的產品名稱和每種產品的價格。我應該使用什麼類型的集合?

我需要做的是讓用戶輸入任何單詞,並將包含該單詞的所有產品連同其價格一起顯示在列表框中。就這樣。

  1. 什麼類型的集合最適合這種情況?
  2. 如果我需要根據產品名稱或價格進行排序,選擇是否仍然相同?

現在我正在使用一個XML文件,但我認爲使用集合,以便我可以嵌入代碼中的所有值更簡單。感謝您的建議。

+0

請不要在標題中放置C#。這就是標籤的用途。 – Amy 2011-12-24 08:13:56

+0

不是集合:您可以使用SQLLite存儲數據並訪問它。 – 2011-12-24 08:39:11

回答

10

A Dictionary將完成這項工作。但是,如果您正在進行快速部分匹配(例如,搜索爲用戶類型),則可以通過創建指向同一項目的多個鍵來獲得更好的性能。例如,「Apple」這個詞可能位於「Ap」,「App」,「Appl」和「Apple」。

我已經在類似數量的記錄上使用了這種方法,結果非常好。我已將我的10K源項目轉換爲大約50K個唯一密鑰。這些詞條中的每一個都指向一個列表,其中包含對該詞所有匹配的引用。然後,您可以更有效地搜索這個小得多的列表。儘管創建了大量的列表,但內存佔用是相當合理的。

如果需要,您還可以自行組成自己的密鑰,以重定向常見拼寫錯誤或指向相關項目。這也消除了大多數使用唯一鍵的問題,因爲每個鍵都指向一個列表。單個項目可以按其名稱中的每個單詞進行分類;如果您的產品名稱很長且包含多個單詞,這非常有用。分類項目時,名稱中的每個單詞都可以映射到一個或多個密鑰。

我還應該指出,建設和分類10K項目不應該花很長時間,如果正確完成(幾百毫秒是合理的)。只要您想使用Application,Cache或靜態成員,結果就可以被緩存。

總而言之,得到的結構是一個Dictionary<string, List<T>>,其中字符串是一個短的(2-6個字符效果很好),但是是唯一的鍵。每個關鍵點指向List<T>(或其他集合,如果您如此傾向)與該關鍵字匹配的項目。執行搜索時,您可以找到與用戶提供的術語相匹配的關鍵字。根據您的密鑰長度,您可能會將用戶的搜索截斷爲最大密鑰長度。找到正確的子集合後,您可以使用您希望的任何方法搜索該集合以進行完整或部分匹配。

最後,您可能希望爲列表中的每個項目創建一個輕量級結構,以便您可以存儲有關該項目的其他信息。例如,您可以創建一個小的Product類,它存儲產品的名稱,價格,部門和流行度。這可以幫助您優化顯示給用戶的結果。

總而言之,您可以實時執行智能,詳細,模糊的搜索。

上述結構應提供大致相當於trie的功能。

+1

+1用於提示Product類,展示部分匹配的方法並花時間寫出有用答案 – Adam 2011-12-24 10:05:19

9

10K記錄並不多。

一個Dictionary<string,decimal>將符合該法案。您可以使用LINQ按鍵或按值進行排序,也可以進行搜索。

這裏假定產品名稱是唯一的。

+0

我同意,但我認爲值得指出的是,只有所有字符串都是唯一的,它纔會起作用。 – madd0 2011-12-24 08:15:59

+0

@ madd0 - 公平點。答案已更新。 – Oded 2011-12-24 08:17:05

+0

+1和任何限制,當我們應該停止使用詞典<字符串,小數>或當它會太慢而無效? – 2011-12-24 10:33:12

相關問題