Ist das möglich? Da C# unveränderliche Strings verwendet, könnte man erwarten, dass es ein Verfahren sein, entlang der Linien von:Zeichenpuffer zwischen C# -String-Objekten teilen
var expensive = ReadHugeStringFromAFile();
var cheap = expensive.SharedSubstring(1);
Wenn es keine solche Funktion, warum die Mühe mit Strings unveränderlich zu machen? Oder alternativ, wenn Strings bereits aus anderen Gründen unveränderbar sind, warum bieten Sie diese Methode nicht an?
Der spezifische Grund, den ich in diesem untersuchen werde, tut etwas Parsing. Einfache rekursive Abstiegs-Parser (wie der von TinyPG erzeugte oder leicht von Hand geschriebene) verwenden Teilstring überall. Das bedeutet, wenn Sie ihnen eine große Datei zum Parsen geben, ist die Speicherabwanderung unglaublich. Sicher gibt es Workarounds - im Grunde rollen Sie Ihre eigene SubString-Klasse, und dann vergessen Sie natürlich, String-Methoden wie StartsWith oder String-Bibliotheken wie Regex zu verwenden, so dass Sie auch Ihre eigene Version dieser rollen müssen. Ich nehme an, dass Parser-Generatoren wie ANTLR das grundsätzlich tun, aber mein Format ist einfach genug, um ein solches Monster-Tool nicht zu rechtfertigen. Selbst TinyPG ist wahrscheinlich ein Overkill.
jemand bitte sagen Sie mir, ich bin einige offensichtliche oder nicht so offensichtliche Standard C# Methodenaufruf irgendwo fehlt ...
Ich habe gerade eine mögliche Problemumgehung getestet. Eine Möglichkeit, das Problem zu lösen, wäre, einen Regex mit der Mitte eines Strings abgleichen zu können. Dies ist möglich, wenn Sie "^. {N}" an den Anfang der Regex anhängen. Es scheint jedoch, dass die Regex-Bibliothek nicht schlau genug ist, um N Zeichen in einem Vorgang zu überspringen. Es dauert O (N) Zeit, so dass Übereinstimmungen länger und länger dauern, wenn N wächst. Seufzer. –
Hah, natürlich hat Regex.Match einen optionalen startat-Parameter, der offensichtlich O (1) ist. Die Workaround funktioniert also doch. Ich würde es keine saubere Lösung nennen, aber es wird ... –