[英]Case insensitive search on Case sensitive dictionary C#
我有一個區分大小寫的字典,
Dictionary<string, uint> itemNames = new Dictionary<string, uint>(StringComparer.Ordinal);
所以我可以在這本字典中有區分大小寫的鍵。
例如我可以有以下鍵值對,
...
當有人傳遞密鑰時,我想檢索該值。 檢索應該部分不區分大小寫,這意味着,如果完全匹配,則返回區分大小寫的結果,如果不存在區分大小寫的鍵,則檢索不區分大小寫的鍵值。
例如,將上述值插入到字典中
如果用戶將密鑰作為“TEST”傳遞,我需要返回 20。
如果用戶將密鑰作為 "TEST1" 傳遞,則找不到區分大小寫的密鑰,因此我需要返回 30。
如何在 C# 中實現這一點?
您應該首先使用TryGetValue
來檢查是否有項目。 如果沒有,請選擇第一個匹配項:
string key = "test1";
int val;
if (!itemNames.TryGetValue(key, out val))
{
val = itemNames.FirstOrDefault
(k => string.Equals(k.Key, key, StringComparison.OrdinalIgnoreCase)
)?.Value ?? 0;
}
但是請注意此代碼的性能。 如果您有一本大字典,但在第一次嘗試時有很多遺漏,那么第二個(不區分大小寫)字典會更好。
性能方面,獲得O(1)
平均查找時間的唯一方法是擁有兩個字典,其中一個將使用默認比較器,另一個使用不區分大小寫的:
// map each string to single item
Dictionary<string, int> CaseSensitive;
// map each string to multiple items, case insensitive
Dictionary<string, List<KeyValuePair<string, int>>> CaseInsensitive;
甚至
// map each string to single item
Dictionary<string, int> CaseSensitive;
// map each string to multiple items, case insensitive, with O(1) lookup time
Dictionary<string, HashSet<KeyValuePair<string, int>>> CaseInsensitive;
然后,您的不區分大小寫的搜索可以正確返回所有匹配項,而不僅僅是最近插入的匹配項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.