簡體   English   中英

在區分大小寫的字典 C# 上進行不區分大小寫的搜索

[英]Case insensitive search on Case sensitive dictionary C#

我有一個區分大小寫的字典,

 Dictionary<string, uint> itemNames = new Dictionary<string, uint>(StringComparer.Ordinal);

所以我可以在這本字典中有區分大小寫的鍵。

例如我可以有以下鍵值對,

  1. {測試,10}
  2. {測試,20}
  3. { 測試 1, 30 }
  4. { 測試 2, 40 }

...

當有人傳遞密鑰時,我想檢索該值。 檢索應該部分不區分大小寫,這意味着,如果完全匹配,則返回區分大小寫的結果,如果不存在區分大小寫的鍵,則檢索不區分大小寫的鍵值。

例如,將上述值插入到字典中

如果用戶將密鑰作為“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.

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