swanrnd
@swanrnd
Издатель HTML5 игр

C#. Как оптимально удалить переходы на новую строку?

Есть строка около 20МБ.
В ней куча переходов на новую строку.
Я думаю насчет 2-х вариантов.
1)
int pos=result.IndexOf("\n");
              result=result.Remove(pos, 1);

Конечно все это в цикле.

2) result=result.Replace("\n", "");

Я пробовал на маленьких файлах, все равно не быстро.
Какой лучше? Есть ли еще более оптимальные варианты?
  • Вопрос задан
  • 4700 просмотров
Решения вопроса 3
aush
@aush
@lam0x86 прав, операции со строками достаточно оптимизированы в .net и в очень редких случаях вам может понадобиться дополнительная оптимизация. Я проверил и result = result.Replace("\n", "") работает быстрее представленных вариантов.

На самом деле, Replace помечен атрибутом [MethodImpl(MethodImplOptions.InternalCall)], т.е. он оптимизирован на уровне CLR, так что врядли без какой-то специфичной оптимизации под вашу задачу и unsafe кода можно сделать его быстрее.

Вариант со StringBuilder из комментария работает, кроме специфичных случаев, в ~3 раза медленнее Replace, так что не стоит заморачиваться.
Ответ написан
public string FastReplace(string s){
        int len = s.Length;
        char* newChars = stackalloc char[len];
        char* currentChar = newChars;

        fixed (char* p = s) {
            var input = p;
            do {
                 if(*input!='\n'){
                    *currentChar++ = *input;
                 }
           } while (*(++input) != '\0');
           }
 return new string(newChars, 0, (int) (currentChar - newChars));}

Так быстрее
Ответ написан
RuslanSayko
@RuslanSayko
Всё решается в четыре строки.)
string pattern= string.Format(@"({0})|\n", Environment.NewLine);
Regex rex = new Regex(pattern, RegexOptions.Multiline | RegexOptions.IgnoreCase);
string text = "Здесь нужный текст";
var NewText = rex.Replace(text, string.Empty);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы