我有一个区分大小写的字典(非常庞大的字典)。我想使用ignore-case(不区分大小写)搜索此字典的键。 我不想使用foreach迭代整个字典并比较每个值,因为字典包含太多数据。
使用C#有更好(最有效)的方法吗?我想要一些建议。
答案 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);