Это быстрый способ сделать это, я имею в виду.
Он не использует дорогую функцию регулярных выражений.
Он также не использует несколько функций замещения, каждая из которых в отдельности выполняла цикл по данным с несколькими проверками, распределениями и т. Д.
Таким образом, поиск выполняется непосредственно в одном цикле for
. Для того, сколько раз необходимо увеличить емкость массива результатов, в функции Array.Copy
также используется цикл. Это все петли.
В некоторых случаях более эффективный размер страницы может быть более эффективным.
public static string NormalizeNewLine(this string val)
{
if (string.IsNullOrEmpty(val))
return val;
const int page = 6;
int a = page;
int j = 0;
int len = val.Length;
char[] res = new char[len];
for (int i = 0; i < len; i++)
{
char ch = val[i];
if (ch == '\r')
{
int ni = i + 1;
if (ni < len && val[ni] == '\n')
{
res[j++] = '\r';
res[j++] = '\n';
i++;
}
else
{
if (a == page) // Ensure capacity
{
char[] nres = new char[res.Length + page];
Array.Copy(res, 0, nres, 0, res.Length);
res = nres;
a = 0;
}
res[j++] = '\r';
res[j++] = '\n';
a++;
}
}
else if (ch == '\n')
{
int ni = i + 1;
if (ni < len && val[ni] == '\r')
{
res[j++] = '\r';
res[j++] = '\n';
i++;
}
else
{
if (a == page) // Ensure capacity
{
char[] nres = new char[res.Length + page];
Array.Copy(res, 0, nres, 0, res.Length);
res = nres;
a = 0;
}
res[j++] = '\r';
res[j++] = '\n';
a++;
}
}
else
{
res[j++] = ch;
}
}
return new string(res, 0, j);
}
Теперь я понимаю, что \ n \ r на самом деле не используется на базовых платформах. Но кто будет использовать два типа разрывов строк подряд для обозначения двух разрывов строк?
Если вы хотите это знать, то вам нужно посмотреть, прежде чем узнать, используются ли оба \ n и \ r по отдельности в одном документе.