我可以使用Hashcode直接在C#字典中查找值吗

我可以使用Hashcode直接在C#字典中查找值吗,c#,dictionary,C#,Dictionary,我有很多口述的例子,这些词典的内容经常变化,大约有100个条目(有时少得多)。 我需要经常查询这本词典。 我还不太确定,但我认为我的字典查找越来越昂贵,并且对我的性能产生了不利影响(这是一个关键问题) 我可以缓存字符串键的哈希代码吗 int hc = MyStrKey.GetHasCode(); 然后通过hashcode直接在字典中查找相应的值(如果可以的话)? 如果这是可能的,是不是不推荐,值得加速 我所说的内容经常变化,是指随着时间的推移,我在字典中添加和删除条目 另一种做法是否可以改为

我有很多口述的例子,这些词典的内容经常变化,大约有100个条目(有时少得多)。 我需要经常查询这本词典。 我还不太确定,但我认为我的字典查找越来越昂贵,并且对我的性能产生了不利影响(这是一个关键问题)

我可以缓存字符串键的哈希代码吗

 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中的项与给定的键进行比较

把它想象成按颜色把乐高积木放在桶里——知道你需要的乐高积木的颜色有助于你更快地找到它,但你仍然需要知道你需要找到正确积木的确切积木

你们能查一下这个项目吗