Case Insensitive Dictionary with char key in C#
如果我有一个
我知道,在
Dictionary类有一个接受任何
这对于在不区分大小写的情况下实现
- 比较char忽略大小写的正确方法是什么?
您可以实现自己的比较器:
1 2 3 4 5 6 7 8 9 10 11 12 | 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(); } } |
并将其传递给构造函数:
您也可以实现一个扩展方法:
1 2 3 4 | public static bool ContainsKeyInsensitive(this Dictionary<char, ...> dict, char c) { return dict.ContainsKey(char.ToUpper(c)) || dict.ContainsKey(char.ToLower(c)); } |
你也可以叫它两次。
1 2 3 4 | if (dict.ContainsKey(char.ToLowerInvariant(ch)) || dict.ContainsKey(char.ToUpperInvariant(ch))) { ... } |
作为一种扩展方法,它变成:
1 2 3 4 | public static bool ContainsKeyInsensitive<T>(this Dictionary<char, T> dict, char ch) { return dict.ContainsKey(char.ToLowerInvariant(ch)) || dictionary.ContainsKey(char.ToUpperInvariant(ch)); } |
像这样定义字典:
1 |
起初,我知道公认的答案是有效的,这是一个很好的答案。然而,我发现不需要实现任何扩展方法/附加逻辑来实现期望的结果。
我想你使用字典是因为你想把一个键映射到一个特定的值——这正是它们的作用所在。如果您只使用它来查找密钥,那么应该使用
好吧,这么说吧,让我们来看看你对
- 您愿意映射大写和小写,使大写和小写都具有不同的值。
- 您只愿意映射小写,这意味着大写与大写具有相同的值。
- 您只愿意映射大写字母,这意味着小写字母的值与大写字母的值相同。
我会解释这三个问题。对于所有选项,考虑不知道输入字符是大写还是小写。
选项1;不同的键,不同的值。
这两种方法都要映射。如果需要
选项2:小写与大写具有相同的值。
如果您想随时获取小写值,只需调用
选项3:大写与小写具有相同的值。
同样的故事!现在,使用
同样适用于不区分大小写的
下面的代码片段应该演示它是如何工作的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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,它会给出什么信息?你仍然不知道到底是哪一个存在——这就是为什么你应该选择映射大小写并坚持下去的原因。