這可能嗎?考慮到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