我可以使用Hashcode直接在C#字典中查找值吗
我有很多口述的例子,这些词典的内容经常变化,大约有100个条目(有时少得多)。 我需要经常查询这本词典。 我还不太确定,但我认为我的字典查找越来越昂贵,并且对我的性能产生了不利影响(这是一个关键问题) 我可以缓存字符串键的哈希代码吗我可以使用Hashcode直接在C#字典中查找值吗,c#,dictionary,C#,Dictionary,我有很多口述的例子,这些词典的内容经常变化,大约有100个条目(有时少得多)。 我需要经常查询这本词典。 我还不太确定,但我认为我的字典查找越来越昂贵,并且对我的性能产生了不利影响(这是一个关键问题) 我可以缓存字符串键的哈希代码吗 int hc = MyStrKey.GetHasCode(); 然后通过hashcode直接在字典中查找相应的值(如果可以的话)? 如果这是可能的,是不是不推荐,值得加速 我所说的内容经常变化,是指随着时间的推移,我在字典中添加和删除条目 另一种做法是否可以改为
int hc = MyStrKey.GetHasCode();
然后通过hashcode直接在字典中查找相应的值(如果可以的话)?
如果这是可能的,是不是不推荐,值得加速
我所说的内容经常变化,是指随着时间的推移,我在字典中添加和删除条目
另一种做法是否可以改为使用int键,将实际字符串键的关联缓存到unique(到特定字典)int键,并改用dictionary
我是不是可能找错人了?我怀疑这会有多大区别,但你可以做一些计时测试来找出答案 您可以为缓存哈希代码的字符串编写一个简单的不可变包装类,并将其用作密钥类型,例如:
public sealed class StringKey: IEquatable<StringKey>
{
public StringKey(string key)
{
Contract.Requires(key != null);
_key = key;
_hashCode = key.GetHashCode();
}
public override int GetHashCode()
{
return _hashCode;
}
public bool Equals(StringKey other)
{
if (ReferenceEquals(null, other))
return false;
if (ReferenceEquals(this, other))
return true;
return (_hashCode == other._hashCode) && string.Equals(_key, other._key);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj))
return false;
if (ReferenceEquals(this, obj))
return true;
return obj is StringKey && Equals((StringKey) obj);
}
public string Key
{
get
{
return _key;
}
}
private readonly string _key;
private readonly int _hashCode;
}
公共密封类StringKey:IEquatable
{
公共字符串键(字符串键)
{
Contract.Requires(key!=null);
_钥匙=钥匙;
_hashCode=key.GetHashCode();
}
公共覆盖int GetHashCode()
{
返回hashCode;
}
公共布尔等于(StringKey其他)
{
if(ReferenceEquals(null,其他))
返回false;
if(ReferenceEquals(this,other))
返回true;
返回(_hashCode==other._hashCode)&&string.Equals(_key,other._key);
}
公共覆盖布尔等于(对象对象对象)
{
if(ReferenceEquals(null,obj))
返回false;
if(ReferenceEquals(this,obj))
返回true;
返回obj为StringKey&&Equals((StringKey)obj);
}
公共字符串密钥
{
得到
{
返回_键;
}
}
私有只读字符串\u密钥;
私有只读int_哈希代码;
}
然而,正如我所说,我怀疑这会有很大的不同。我怀疑这会有很大的不同,但你可以做一些计时测试来找出答案 您可以为缓存哈希代码的字符串编写一个简单的不可变包装类,并将其用作密钥类型,例如:
public sealed class StringKey: IEquatable<StringKey>
{
public StringKey(string key)
{
Contract.Requires(key != null);
_key = key;
_hashCode = key.GetHashCode();
}
public override int GetHashCode()
{
return _hashCode;
}
public bool Equals(StringKey other)
{
if (ReferenceEquals(null, other))
return false;
if (ReferenceEquals(this, other))
return true;
return (_hashCode == other._hashCode) && string.Equals(_key, other._key);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj))
return false;
if (ReferenceEquals(this, obj))
return true;
return obj is StringKey && Equals((StringKey) obj);
}
public string Key
{
get
{
return _key;
}
}
private readonly string _key;
private readonly int _hashCode;
}
公共密封类StringKey:IEquatable
{
公共字符串键(字符串键)
{
Contract.Requires(key!=null);
_钥匙=钥匙;
_hashCode=key.GetHashCode();
}
公共覆盖int GetHashCode()
{
返回hashCode;
}
公共布尔等于(StringKey其他)
{
if(ReferenceEquals(null,其他))
返回false;
if(ReferenceEquals(this,other))
返回true;
返回(_hashCode==other._hashCode)&&string.Equals(_key,other._key);
}
公共覆盖布尔等于(对象对象对象)
{
if(ReferenceEquals(null,obj))
返回false;
if(ReferenceEquals(this,obj))
返回true;
返回obj为StringKey&&Equals((StringKey)obj);
}
公共字符串密钥
{
得到
{
返回_键;
}
}
私有只读字符串\u密钥;
私有只读int_哈希代码;
}
然而,正如我所说,我怀疑这会有多大不同
我还不太确定,但我想我查字典的费用越来越高了
首先进行测量,准确地找出您要解决的问题。使用100个键/值对在字典中查找应该非常快
至于使用int或string作为键,请注意这些项的hashcode计算没有在fclapi中定义,而是特定于实现的。不可能作一般性的陈述
我还不太确定,但我想我查字典的费用越来越高了
首先进行测量,准确地找出您要解决的问题。使用100个键/值对在字典中查找应该非常快
至于使用int或string作为键,请注意这些项的hashcode计算没有在fclapi中定义,而是特定于实现的。不可能做出一般性的陈述。请记住,哈希代码不是从字典(或哈希表)中查找项目所需的唯一项目。它只会加快查找物品所在的桶的速度 两个不相等的项有相同的散列码,这当然是可能的(并非罕见的)。字典使用hashcode查找bucket,然后使用
Equals
将该bucket中的项与给定的键进行比较
把它想象成按颜色把乐高积木放在桶里——知道你需要的乐高积木的颜色有助于你更快地找到它,但你仍然需要知道你需要找到正确积木的确切积木
那么你能在字典里用散列码查找条目吗?可能,但您仍然需要原始值以确保获得正确的项。请记住,哈希代码不是从字典(或哈希表)中查找项所需的唯一项。它只会加快查找物品所在的桶的速度 两个不相等的项有相同的散列码,这当然是可能的(并非罕见的)。字典使用hashcode查找bucket,然后使用
Equals
将该bucket中的项与给定的键进行比较
把它想象成按颜色把乐高积木放在桶里——知道你需要的乐高积木的颜色有助于你更快地找到它,但你仍然需要知道你需要找到正确积木的确切积木
你们能查一下这个项目吗