这可能吗?考虑到C#使用不可改变的字符串,可以预期会有沿着线的方法:在C#字符串对象之间共享字符缓冲区
var expensive = ReadHugeStringFromAFile();
var cheap = expensive.SharedSubstring(1);
如果没有这样的功能,所以有做串不可变麻烦? 或者,如果字符串由于其他原因已经不可变,为什么不提供这种方法?
我正在研究这个问题的具体原因是做一些文件解析。简单的递归下降解析器(例如TinyPG生成的解析器,或者手工编写的解析器)在整个地方使用Substring。这意味着如果你给他们一个大文件解析,内存流失是难以置信的。当然有一些解决方法 - 基本上是自己编写SubString类,然后当然忘记了可以使用String方法,比如StartsWith或者Regex等字符串库,所以你也需要推出自己的版本。我认为ANTLR这样的解析器生成器基本上是这样做的,但是我的格式很简单,不足以证明使用这样的怪物工具是合理的。即使TinyPG可能是一个过度杀伤力。
有人请告诉我,我错过了一些明显或不那么明显的标准的C#方法调用的地方...
我刚刚测试了一个潜在的解决方法。解决问题的一种方法是能够将正则表达式匹配到字符串的中间。如果您将“^。{N}”附加到正则表达式的开头,这是可能的。然而,似乎正则表达式库在一次操作中不够聪明,只能跳过N个字符。它需要O(N)时间,所以随着N的增长,匹配开始花费更长和更长的时间。叹。 – 2009-06-16 22:00:52
哈,当然Regex.Match有一个可选的startat参数,显然是O(1)。所以解决方法毕竟工作。我不会说这是一个干净的解决方案,但它会做... – 2009-06-16 22:04:06