簡體   English   中英

在C#中使用char鍵的不區分大小寫字典

[英]Case Insensitive Dictionary with char key in C#

如果我有一個Dictionary<char,...>是否可以使方法ContainsKey不區分大小寫?

我知道,在Dictionary<string,...>中使用的是StringComparer.InvariantCultureIgnoreCase,但是當字典中的鍵是char-type時該怎么辦?

Dictionary類有一個構造函數,它接受任何IEqualityComparer 您需要做的是實現一個簡單的不區分大小寫的IEqualityComparer<char>並將其傳遞給構造函數,並在評估密鑰時使用它。

這是一個類似的問題,用於在沒有區分大小寫的情況下實現IComparer<char> IEqualityComparer幾乎完全相同:

您可以實現自己的比較器:

public class CharComparer : IEqualityComparer<char>
{
     public bool Equals(char c1, char c2)
     {
          return char.ToLowerInvariant(c1) == char.ToLowerInvariant(c2);
     }
     public int GetHashCode(char c1)
     {
          return char.ToLowerInvariant(c1).GetHashCode();
     }

}

並將其傳遞給構造函數:

var dict = new Dictioanry<char, object>(new CharComparer());

你可以實現一個擴展方法:

public static bool ContainsKeyInsensitive(this Dictionary<char, ...> dict, char c)
{      
  return dict.ContainsKey(char.ToUpper(c)) || dict.ContainsKey(char.ToLower(c));
}

你也可以叫它兩次。

if (dict.ContainsKey(char.ToLowerInvariant(ch)) || dict.ContainsKey(char.ToUpperInvariant(ch)))
{
    ...
}

作為擴展方法,這變為:

public static bool ContainsKeyInsensitive<T>(this Dictionary<char, T> dict, char ch)
{
    return dict.ContainsKey(char.ToLowerInvariant(ch)) || dictionary.ContainsKey(char.ToUpperInvariant(ch));
}

首先; 我知道接受的答案是有效的,這是一個很好的答案。 然而,我發現實現任何擴展方法/附加邏輯以實現所需結果不是必需的。

我想你正在使用字典,因為你想將一個鍵映射到一個特定的值 - 這正是它們的用途。 如果僅使用它來查找鍵,則應使用HashSet<char>

好吧,那就是說,讓我們來看看你對char的三個選擇;

  • 您願意映射大寫小寫,為大寫和小寫提供不同的值。
  • 你願意映射小寫字母,大寫字母的意思有相同的價值為大寫。
  • 你願意映射大寫,小寫意味着具有相同的價值為大寫。

我會解釋他們三個。 對於所有選項,請考慮不知道輸入字符是大寫還是小寫。

選項1; 不同的鍵,不同的值。

映射兩者是這里的方法。 如果您需要'a''A'的不同值, 則無論如何都需要添加它們 因此,您可以使用.ContainsKey() ,它將返回所需的結果。 此選項可能不符合您的需求,因為您正在尋找不區分大小寫的字典。

選項2:小寫與大寫具有相同的值。

如果你想要隨時隨地獲取小寫值,只需調用.ContainsKey(yourChar.ToLower())

選項3:大寫與小寫具有相同的值。

相同的故事! 只有現在,使用.ContainsKey(yourChar.ToUpper())來獲得正確的結果。 由於您在評論中發布了您的詞典僅包含大寫字符,因此應該采用這種方式。

對於不區分大小寫的Dictionary<string,T> ; 只是映射小寫或大寫(小寫有我的偏好,但這是你自己的選擇)。

以下代碼段應演示其工作原理。

Dictionary<char, object> dic = new Dictionary<char, object>();

public object GetIfKeyExists(char c)
{
    // Consider c = 'a' or c = 'A'

    // Option 1: Both have different values, so they should be existing anyway.
    if (dic.ContainsKey(c)) return dic[c];

    // Option 2: Only lowercase is mapped.
    char correctInput = c.ToLower();
    if (dic.ContainsKey(correctInput)) return dic[correctInput];

    // Option 3: Only uppercase is mapped.
    char correctInput = c.ToUpper();
    if (dic.ContainsKey(correctInput)) return dic[correctInput];
}

然后,最后,我仍然想知道你為什么要檢查上限下限。 如果它返回true,它會給出什么信息? 你仍然不知道究竟存在哪一個 - 這就是為什么你應該選擇映射大寫或小寫並堅持下去。

只需像這樣定義字典:

Dictionary<string, int> Dict = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);

暫無
暫無

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

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