Возможно ли это? Учитывая, что C# использует неизменяемые строки, можно было бы ожидать, что будет метод вдоль линий:Обмен символьным буфером между объектами строк C#
var expensive = ReadHugeStringFromAFile();
var cheap = expensive.SharedSubstring(1);
Если нет такой функции, то зачем с созданием строки неизменны? Или, альтернативно, если строки уже неизменяемы по другим причинам, почему бы не предоставить этот метод?
Конкретная причина, по которой я занимаюсь этим, заключается в синтаксическом анализе файлов. Простые рекурсивные анализаторы спуска (например, созданные TinyPG или легко написанные вручную) используют подстроку по всему месту. Это означает, что если вы даете им большой файл для разбора, отключение памяти невероятно. Конечно, есть обходные пути - в основном сворачивайте свой собственный класс SubString, а затем, конечно, забывайте о возможности использования таких методов String, как StartsWith или String, таких как Regex, поэтому вам нужно также перевернуть свою собственную версию. Я предполагаю, что генераторы парсеров, такие как ANTLR, в основном делают это, но мой формат достаточно прост, чтобы не оправдывать использование такого монстра. Даже TinyPG, вероятно, перебор.
Кто-то пожалуйста, скажите мне, что я не хватает какой-то очевидный или не столь очевидный стандарт C# вызов метода где-то ...
Я только что испытал потенциальное обходное решение. Одним из способов решения проблемы было бы совпадение регулярного выражения с серединой строки. Это возможно, если вы присоедините «^. {N}» к началу Regex. Однако, похоже, библиотека Regex недостаточно умна, чтобы просто пропускать N символов за одну операцию. Это занимает время O (N), поэтому матчи начинают больше и дольше по мере роста N. Вздох. –
Hah, конечно, Regex.Match имеет необязательный параметр startat, который, очевидно, O (1). Поэтому обходной путь действительно работает. Я бы не назвал это чистым решением, но это будет ... –