.NET的快速且内存高效的ASCII字符串类

11

这个问题可能之前已经被问过了,但我找不到相关的帖子。是否有一个类可以处理ASCII字符串?其好处有很多:

  1. 比较应该会更快,因为只需按字节比较(而不是UTF-8带有可变编码)
  2. 内存效率高,大型字符串应该使用约一半的内存
  3. ToUpper()/ToLower() 的更快版本,使用与语言无关的查找表

Jon Skeet编写了基本的 AsciiString实现,并证明了#2,但我想知道是否有人将其进一步完善成一个类。我相信会有用处,虽然通常没有人会采取这样的路线,因为所有现有的String函数都必须手动重新实现。在String和AsciiString之间的转换将到处分散,使本来简单的程序变得复杂。

是否有这样的一个类?在哪里?


7
仅有几点评论:.NET 字符串在内部使用 UTF-16,并且您可以通过使用带有 StringComparison 参数并将其设置为 Ordinal 的 String.Compare 重载来大大加速比较。 - Dirk
2
序数比较直接使用UTF-16编码的整数值,不考虑当前文化或者同一字符符号可以由多个Unicode代码点描述的情况。通常比较这些会返回true,但在使用序数时会返回false。 - Dirk
是的,其他一些字符串函数也接受StringComparison参数,包括String.IndexOf - Dirk
5
在.NET中,字符串比较已经得到了大量优化。实际的代码在CLR内部运行,并用C++编写。这非常重要,必要的,以避免激发程序员寻找更高效但基本上是有缺陷的字符串实现,因为它只能支持世界上使用的少数语言。任何维护旧的C或C++代码的人都知道那是多么巨大的错误。 - Hans Passant
你有没有考虑压缩你的字符串?相等比较会变得容易,而且内存使用也会大大改善(对于大多数实际字符串而言),但是 ToUpper/ToLower/string 转换会更加费力。根据你真正想要做什么,这可能就是你所需要的全部。 - Tim S.
可能相关:http://stackoverflow.com/q/16091406/56778 - Jim Mischel
2个回答

6
我想分享一下我的努力成果,尽量支持字符串并具有兼容性,如有需要,可以作为一个不错的基础进行改进。ASCIIChar结构和ASCIIString字符串会隐式转换为其本地对应项,以便于使用。比起查找列表,已经实现了替代ToUpper/Lower等操作的建议,并且所有操作都尽可能快速和内存友好。抱歉无法发布源代码,因为它太长了。请参见下面的链接。
  • ASCIIChar - 替换字符,将值存储在字节而不是整数中,并提供字符串类的支持方法和兼容性。实现了可用于char的所有虚拟方法和属性。

  • ASCIIChars - 为每个有效的ASCII字符提供静态属性,以便于使用。

  • ASCIIString - 替换字符串,将字符存储在字节数组中,并实现了几乎所有可用于字符串的方法和属性。


真棒!一个完整的ASCIIString类,通过加速实现与String类API相同的方法!太棒了.... - Robin Rodricks
1
@PeterLaCombJr。是的,char结构和string类都是不可变的(唯一的本地变量是只读的)。 - Ashigore
我在字符串类中纠正了一个最后一分钟的错误,即Parse方法不是静态的。 - Ashigore
@Ashigore - 你是否已经在Github上发布了这段代码或者创建了Nuget包?我想使用它,虽然我可以从pastebin上复制,但我想知道它是否被放置在一个社区可以贡献/编辑和更新的地方。 - pstrjds

-2

Dotnet没有直接支持ASCII字符串。字符串是UTF16,因为Windows API仅支持ASCII(一个字符-一个字节)或UTF16。 Utf8将是最佳解决方案(Java使用它),但.NET不支持它,因为Windows不支持。


Windows API 可以在字符集之间进行转换,但是 Windows API 仅适用于 1 字节字符或 2 字节字符,因此如果您在 .NET 中使用 UTF8 字符串,则必须每次进行转换,这会影响性能。Dotnet 可以通过 BinaryWriter/BinaryReader 或简单的 StreamWriter/StreamReader 使用 UTF8 和其他编码。


1
这并没有回答所提出的问题,应该是一条评论。你还没有足够的声望来发表评论,但这就是现实。赚取一些声望,然后你就可以评论了。你可以通过给出真正的答案来回答问题来获得声望。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接