簡體   English   中英

字典松動,需要建議

[英]Loose dictionary, need advice

我需要創建一個字典,其中鍵是字符串,值是Object。 但是我不希望鍵與用戶提供的字符串完全匹配。 相反,我想鍵入包含字符串的一部分。 我以身作則

如果字典中的鍵“ Johnson”下有一個條目,我希望能夠找到給定輸入字符串“ John”,“ Jo”的值。 我也希望能夠根據給定條件提取與輸入字符串匹配的多個值。 例如,如果有條目“ John A”和“ John B”,我希望具有類似於FindFirst的功能,該功能會將迭代器返回到第一個匹配的值。

理想情況下,我希望使用現有的System.Collections.Generic.Dictionary可能派生一個新類並重寫某些方法

我懷疑SortedList<TKey, TValue>將是您最好的選擇,它是基於二進制搜索樹的字典。 它的Keys屬性返回具有O(1)訪問時間的IList<TKey>

您將獲取Keys屬性並執行二進制搜索以找到以您的搜索鍵開頭的鍵。 然后從該示例鍵向上和向下查找,以找到實際匹配的鍵范圍。 這將提供O(log n)性能,而不是您通過查看所有鍵而獲得的O(n)性能。

我不會從中得出結論-我會在內部編寫一個具有 SortedList<,>的類型。

盡管我懷疑字典是否適合此類內容,但您可以使用:

dictionary[dictionary.Keys.First(d=>d.StartsWith("Jo"))]

您在這里丟失了字典的大部分值,因為它已通過使用鍵進行了優化,可以快速檢索值。 在這種情況下,您必須遍歷列表中的每個鍵。

我必須+1喬恩指出SortedList<TKey,TValue>

通過提供IEqualityComparer的實現,可以將自定義相等比較與Dictionary結合使用。 但是,Dictionary是一個哈希映射,需要從每個鍵到同一整數哈希的映射,這使得它在您的情況下不太有用。 您可以使用SortedDictionary (它也是IDictionary),提供自定義IComparer並獲取O(log(n))查找時間(而不是Dictionary理想情況下可以提供的O(1))。

您可以使用普通詞典並提供自己的比較器,查看通用詞典 ,特別是有關提供自己的比較器的部分

主要問題是,由於您使用的是自定義規則,因此您基本上必須與所有鍵進行比較,直到找到匹配項為止,因此請確保自定義比較器在不匹配的情況下能夠快速退出(例如,以不同的字母開頭) )。

我認為您應該考慮將對適當關鍵字的搜索與對基礎記錄的訪問分開。

例如,您擁有一個純樹鍵的btree +結構,您可以在其中找到第一個匹配記錄,然后遵循btree +枚舉器,直到沒有匹配項為止。

類似於數據庫中的非聚集索引。 首先找到密鑰,然后找到記錄。

您在“ Johnson”中的示例“ Jo”和“ John”是“ StartsWith()”的示例,其中的鍵排序將使您受益。 如果還希望只尋找一個子字符串而不是初始段,則需要查看其他存儲和查找密鑰的算法。

如果您不確定兩者都需要並且能夠利用優化搜索,則應該對所有鍵進行內存內掃描,然后集中精力優化匹配謂詞。 例如,通過使用預編譯搜索的Regex選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM