想知道这是否可行。
我们有一个第三方库,其中包含有关用户的标识信息......
与库的主要交互是通过一个用字符串键入的HashTable,并返回该键的信息的Object Graph。
问题是,关键显然是区分大小写,但我们从用户浏览器获得的内容并不一定与案例相符...(我们经常将密钥完全小写)
我想知道是否可以对哈希表进行不敏感密钥搜索。
e.g。
Hashtable ht = new Hashtable();
ht.Add("MyKey", "Details");
string result = ht["MyKey"];
string result = ht["MYKEY"];
string result = ht["mykey"];
我们可以向公司提交支持票以添加此功能,是否有支持此功能的其他DataStructures(即新的通用集合/词典)
最后,是否可以覆盖System.String GetHashCode()方法
使所有大小写不变的字符串返回相同的哈希码...例如我认为这是一个不行,因为string
是一个密封的班级
如果有人有任何建议,欢呼声
答案 0 :(得分:31)
使哈希表比较不区分大小写的代码
适用于2.0,3.0,3.5
Hashtable ht = new Hashtable(StringComparer.InvariantCultureIgnoreCase);
您可以在this SO链接上获取有关InvariantCultureIgnoreCase与OrdinalIgnoreCase的信息
OR
Hashtable ht = System.Collections.Specialized.CollectionsUtil.CreateCaseInsensitiveHashtable();
由于不区分大小写的字典集合是如此常见的用法,因此.NET Framework具有一个CollectionUtil类,该类支持创建不区分大小写的Hashtable和SortedList对象。通过调用CreateCaseInsensitiveHashtable或CreateCaseInsensitiveSortedList来使用。
对于.Net 1.0(我不确定1.0是否支持StringComparer)
public class InsensitiveComparer : IEqualityComparer
{
CaseInsensitiveComparer _comparer = new CaseInsensitiveComparer();
public int GetHashCode(object obj)
{
return obj.ToString().ToLowerInvariant().GetHashCode();
}
public new bool Equals(object x, object y)
{
if (_comparer.Compare(x, y) == 0)
{
return true;
}
else
{
return false;
}
}
}
Hashtable dehash = new Hashtable(new InsensitiveComparer());
答案 1 :(得分:17)
用字典:
new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
但更简单,我相信StringDictionary
也不区分大小写:
StringDictionary ht = new StringDictionary();
ht.Add("MyKey", "Details");
string result1 = ht["MyKey"];
string result2 = ht["MYKEY"];
string result3 = ht["mykey"];
答案 2 :(得分:2)
您可以向IEqualityComparer
构造函数提供不区分大小写的HashTable
,但这要求您可以影响第三方库中的HashTable
构造。
如果从代码中填充哈希表,则可以在插入时规范化键并再次检索规范化键。
如果您无法影响哈希表的内容,但是您知道密钥的结构,则可以在访问哈希表之前更正用户输入。
答案 3 :(得分:1)
这不是一种非常有效的方法,但您可以随时使用哈希表并从中创建一个StringDictionary:
Hashtable ht = new Hashtable();
ht.Add("FOO", "bar");
StringDictionary dict = new StringDictionary();
foreach(string key in ht.Keys)
dict.Add(key, ht[key].ToString());
string result = dict["foo"]; // Assigns "bar" to result