是否有8个BIT字符的字符串类型?
我需要在RAM中存储很多字符串。 但它们不包含特殊的unicode字符,它们都只包含来自“ISO 8859-1”的字符,即一个字节。
现在我可以转换每个字符串,将其存储在内存中并将其转换回来与.Contains()和类似的方法一起使用它,但这将是开销(在我看来)和缓慢。
是否有一个快速可靠的字符串类,并提供原始字符串类的一些方法,如.Contains()?
我需要这个来在内存中存储更多字符串,使用更少的RAM。 或者还有其他方法吗?
更新:
感谢您的意见和答案。
我有一个存储字符串的类。 然后通过一个方法调用我需要弄清楚我是否已经在内存中有该字符串。 我有大约1000个字符串,以确定它们是否在列表中一秒钟 。 总数亿。 字符串的平均大小约为20个字符。 它真的是关心我的RAM。
我甚至考虑压缩数百万字符串并将这些包存储在内存中。 但是每次我需要访问这些值时我都需要解压缩它。
我也尝试使用HashSet,但所需的内存量甚至更高。
我不需要真正的价值。 只是要知道值是否在列表中。 因此,如果有一个可以做到的哈希值,那就更好了。 但我发现所有内存都需要比纯字符串更多的内存。
目前还没有进一步国际化的计划。 所以这是我应该处理的时候:-)
我不知道使用数据库是否可以解决它。 我不需要取任何东西,只是为了知道该值是否存储在类中。 我需要快速做到这一点。
您不可能从中获得任何重要的表现。 但是,如果您需要节省内存,则此策略可能是合适的。
-
要将
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(西里尔文)等。
根据评论,一个基本上是坏主意。 如果你必须这样做,byte []就是你的朋友。 .NET中没有面向字节的字符串类。
检查string.Intern方法,它可以帮助你:
http://www.yoda.arachsys.com/csharp/strings.html
http://en.csharp-online.net/CSharp_String_Theory%E2%80%94String_intern_pool
无论如何看待你的要求,我认为你已经过度工程了。 你有20个字符串的1000个字符串= 1000 * 20 * 2 = 40,000字节,这不是很多内存。
如果确实有大量数据,请将其存储在带索引的数据库中。 这比一般程序员想出的任何东西要快得多。