17

想知道这是否可能。

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

与库的主要交互是通过一个以字符串为键的 HashTable,并返回该键的信息对象图。

问题是,密钥显然是区分大小写的,但我们从用户浏览器获得的不一定与大小写匹配......(我们经常得到完全小写的密钥)

我想知道是否可以对哈希表进行不区分大小写的键搜索。

例如

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

4 回答 4

31

使哈希表比较不区分大小写的代码

对于 2.0、3.0、3.5

Hashtable ht = new Hashtable(StringComparer.InvariantCultureIgnoreCase);

您可以在此SO 链接上获取有关 InvariantCultureIgnoreCase 与 OrdinalIgnoreCase 的信息

或者

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());
于 2009-05-13T09:49:01.200 回答
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"];
于 2009-05-13T09:39:22.743 回答
2

IEqualityComparer您可以为构造函数提供不区分大小写的值HashTable,但这要求您可以影响HashTable3rd 方库中的构造。

如果您从代码中填充哈希表,您可以在插入时规范化键并再次检索规范化的键。

如果您无法影响哈希表的内容,但您知道键的结构,则可以在访问哈希表之前更正用户输入。

于 2009-05-13T09:39:32.587 回答
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
于 2009-05-13T10:16:47.707 回答