我需要在 RAM 中存储很多字符串。但它们不包含特殊的 unicode 字符,它们都只包含来自“ISO 8859-1”的字符,即一个字节。
现在我可以转换每个字符串,将其存储在内存中并将其转换回以与 .Contains() 和类似的方法一起使用,但这将是开销(在我看来)并且速度很慢。
是否有一个快速可靠的字符串类,并提供原始字符串类的一些方法,如 .Contains()?
我需要这个来在内存中存储更多的字符串,而使用更少的 RAM。还是有其他方法可以做到这一点?
更新:
感谢您的评论和回答。
我有一个存储字符串的类。然后通过一个方法调用,我需要确定我是否已经在内存中拥有该字符串。我有大约 1000 个字符串找出 如果它们在列表中 一秒 .总计数亿。
字符串的平均大小约为 20 个字符。真正关心我的是RAM。
我什至考虑过压缩数百万个字符串并将这些包存储在内存中。但是每次我需要访问这些值时,我都需要对其进行解压缩。
我也尝试使用 HashSet,但所需的内存量甚至更高。
我不需要真正的值(value)。只是想知道该值是否在列表中。因此,如果有一个哈希值可以做到这一点,那就更好了。但我发现的所有内容都需要比纯字符串更多的内存。
目前没有进一步国际化的计划。所以这是我会在需要处理的时候处理的事情:-)
我不知道使用数据库是否可以解决它。我不需要获取任何东西,只需知道该值是否存储在类中。我需要快速完成这项工作。
最佳答案
您不太可能因此获得任何显着的表现。但是,如果您需要节省内存,这种策略可能是合适的。
string
到 byte[]
为此,请使用 Encoding.Default.GetBytes()
[1]。 byte[]
返回 string
对于显示或其他基于字符串的处理,请使用 Encoding.Default.GetString()
. string
上定义的扩展方法,您可以使您的代码看起来更好。和 byte[]
.或者,您可以包装 byte[]
在包装器类型中并将方法放在那里。将此包装器类型设为 struct
,而不是 class
, 否则会产生额外的堆分配,这是您要避免的。 不过,我想警告你——你正在放弃在你的应用程序中使用 Unicode 的能力。每次您认为需要这样做时,您通常应该让所有的警钟响起。最好以可以轻松返回使用
string
的方式构建代码。当内存大小增加并且内存消耗不再是问题时。[1]
Encoding.Default
返回正在运行的操作系统的当前 8 位代码页。英语 Windows 上的默认设置是 Windows-1252,这正是您想要的。对于俄语 Windows,它将是 Windows-1251(西里尔文)等。
关于c# - 有 8 位字符的字符串类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4916838/