使用c#在区分大小写的字典中不敏感地搜索大小写

时间:2012-06-29 11:58:54

标签: c# dictionary

我有一个区分大小写的字典(非常庞大的字典)。我想使用ignore-case(不区分大小写)搜索此字典的键。 我不想使用foreach迭代整个字典并比较每个值,因为字典包含太多数据。

使用C#有更好(最有效)的方法吗?我想要一些建议。

2 个答案:

答案 0 :(得分:4)

因此,如果我理解正确,你想要一个字符串,它按原样保存字符串,但是以不区分大小写的方式进行散列,这样你仍然可以在O(1)的摊销时间内搜索而不管情况如何?

我看到它的方式,您需要在使用this constructor创建IEqualityComparer时传递自定义Dictionary,并在实施IEqualityComparer时将字符串视为全部更高或者小写例如和哈希码相同(即返回字符串的哈希码变为大写)。

例如:

class MyComparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        return x.ToUpper() == y.ToUpper();
    }

    public int GetHashCode(string obj)
    {
        return obj.ToUpper().GetHashCode();
    }
}

...

Dictionary<String, String> dict = new Dictionary<string, string>(new MyComparer());

现在几乎你的字典通常都会保存字符串,但是在搜索或添加时它会将它们视为全部大写,因此“AbcD”被视为与“aBCd”相同(均为“ABCD”)。

答案 1 :(得分:2)

都铎的答案很好,我想通过建议您使用StringComparer.CurrentCultureIgnoreCase而不是创建自己的比较器类(特别是如果预期结果相同)来补充它。

示例:

Dictionary<string, string> openWith = 
                  new Dictionary<string, string>( 
                      StringComparer.CurrentCultureIgnoreCase);

来源:http://msdn.microsoft.com/en-us/library/ms132072.aspx