[英]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.