C# 由插入字符串键入的字典的键是什么

C# 由插入字符串键入的字典的键是什么,c#,string,dictionary,gethashcode,C#,String,Dictionary,Gethashcode,我希望将内存缓存的数据结构与一组内部字符串相关联,并使用已传递的内部字符串实例查找其关联的数据结构 预定义的字符串集的数量大约为1000。缓存填充成本可以忽略,但我需要高性能查找 public class InternedExtras { public DateTime Prop1 {get; set; } public Decimal Prop2 {get; set; } } 理想情况下,我会创建一个基于内部字符串引用的字典,但.Net不会将对象引用公开为特定类型 如果我将我的字典声

我希望将内存缓存的数据结构与一组内部字符串相关联,并使用已传递的内部字符串实例查找其关联的数据结构

预定义的字符串集的数量大约为1000。缓存填充成本可以忽略,但我需要高性能查找

public class InternedExtras
{
  public DateTime Prop1 {get; set; }
  public Decimal Prop2 {get; set; }
}
理想情况下,我会创建一个基于内部字符串引用的字典,但.Net不会将对象引用公开为特定类型

如果我将我的字典声明为:

Dictionary<string, InternedExtras>
字典
然后我担心System.String相等覆盖会在字典查找期间调用逐字符字符串值比较,这将是低效的

一种选择是:

Dictionary<int, InternedExtras> _extrasDictionary

InternedExtras GetInternedExtras( string knownToBeInterned )
{
  return _extrasDictionary[ knownToBeInterned.GetHashCode() ];
}
Dictionary\u extrasDictionary
InternetExtras GetInternetExtras(字符串已输入)
{
返回_extrasDictionary[knownToBeInterned.GetHashCode()];
}
然而,我从来没有完全理解过散列码的数学,也不知道唯一性是不能保证的


我的实习字符串的平均长度是50个字符,我可以部署到最新的.Net版本。

我实际上认为这是您最有效的选择:

Dictionary<string, InternedExtras> _extrasDictionary;
您所引用的逐字符比较将仅在一小部分字符串上调用。这是因为
interned.GetHashCode()
将用于将密钥分组到“bucket”中

这个问题有更多关于这个主题的细节:


@dana-感谢您对字典/哈希代码性能的保证。我认为System.String不会在调用someString.GetHashCode之间存储字符串的哈希代码,这对我来说是正确的吗?我实际上不这么认为(请参阅下面的源代码参考)。我只知道
Dictionary
是快速内存查找的事实上的方法,并且是BCL的一部分(即由Microsoft实现)。如果您有任何疑问,应该运行一些性能测试。
InternedExtras extras = _extrasDictionary[interned];