我有一本区分大小写的字典(非常大)。我想使用忽略大小写(不区分大小写)来搜索这本字典的键。我不想使用 foreach 遍历这个字典并比较每个值,因为字典包含太多数据。
有没有更好(最有效)的方法来使用 C# 来做到这一点?我想要一些建议。
我有一本区分大小写的字典(非常大)。我想使用忽略大小写(不区分大小写)来搜索这本字典的键。我不想使用 foreach 遍历这个字典并比较每个值,因为字典包含太多数据。
有没有更好(最有效)的方法来使用 C# 来做到这一点?我想要一些建议。
因此,如果我理解正确,您想要一个保存字符串的字典,但以不区分大小写的方式散列,这样无论大小写如何,您仍然可以在 O(1) 摊销时间内搜索?
我看到它的方式你需要在使用这个构造函数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”)相同。
Tudor 的答案很好,我想通过建议您使用 StringComparer.CurrentCultureIgnoreCase
而不是创建自己的比较器类来补充它(特别是如果预期结果相同)。
例子 :
Dictionary<string, string> openWith =
new Dictionary<string, string>(
StringComparer.CurrentCultureIgnoreCase);