Esta es la respuesta a la pregunta. La solución dada reemplaza una cadena por la tabla de traducción dada. No usa una función de expresión regular costosa. Tampoco utiliza funciones de reemplazo múltiples que cada uno individualmente recorrió los datos con varias comprobaciones, etc.
Por lo tanto, la búsqueda se realiza directamente en 1 para el ciclo. Para el número de veces que se debe aumentar la capacidad de la matriz de resultados, también se utiliza un bucle dentro de la función Array.Copy. Eso son todos los bucles. En algunos casos, un tamaño de página mayor puede ser más eficiente.
public static string NormalizeNewLine(this string val)
{
if (string.IsNullOrWhiteSpace(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);
}
La tabla de traducción realmente me atrae aunque '\ n' no se use realmente en las plataformas básicas. ¿Quién usaría dos tipos de saltos de línea en sucesión para indicar 2 saltos de línea? Si quiere saber eso, entonces debe echar un vistazo antes para saber si \ ny \ r Ambos se usan por separado en el mismo documento.
Espera, ¿quieres que \ n \ r se correlacione con \ r \ n? Eso no es normalización. Ninguna plataforma común usa \ n \ r como un final de línea. –
No lo dije como una plataforma normal, ¿verdad? He visto código de datos (del código VB específicamente) que lo tiene de esa manera, y tengo que dar cuenta de ello. Perdón si eso no cumple con la definición estricta de "normalizar", pero sin duda cumple con la definición de los datos que necesito procesar, que es el punto – ctacke