使用带字符串键的Hashtables / Dictionaries&案例不敏感搜索

时间:2009-05-13 09:32:53

标签: .net .net-3.5 dictionary hashtable case-insensitive

想知道这是否可行。

我们有一个第三方库,其中包含有关用户的标识信息......

与库的主要交互是通过一个用字符串键入的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是一个密封的班级

如果有人有任何建议,欢呼声

4 个答案:

答案 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