Existe uma maneira melhor de substituir as cordas?
Estou surpreso que Substituir não leva em uma matriz de caracteres ou matriz de seqüência de caracteres. Acho que eu poderia escrever minha própria extensão, mas fiquei curioso para saber se existe uma maneira melhor de fazer o seguinte? Observe que o último Substituir é uma sequência e não um caractere.
myString.Replace(';', '\n').Replace(',', '\n').Replace('\r', '\n').Replace('\t', '\n').Replace(' ', '\n').Replace("\n\n", "\n");
\t
e\r
estão incluídos no\s
. Portanto, seu regex é equivalente a[;,\s]
.\s
é realmente equivalente a[ \f\n\r\t\v]
que você esteja incluindo algumas coisas que não estavam na pergunta original. Além disso, a pergunta original pergunta paraReplace("\n\n", "\n")
qual seu regex não lida.Se você está se sentindo particularmente inteligente e não deseja usar o Regex:
Você pode agrupar isso em um método de extensão com pouco esforço também.
Edit: Ou apenas espere 2 minutos e eu acabarei escrevendo de qualquer maneira :)
E pronto ...
fonte
Regex.Replace
é 8 vezes mais lento que váriasstring.Replace
chamadas seguidas. e 4x mais lento queSplit
+Join
. Veja gist.github.com/MarcinJuraszek/c1437d925548561ba210a1c6ed144452Você pode usar a função Agregada do Linq:
Aqui está o método de extensão:
Exemplo de uso do método de extensão:
fonte
Esta é a maneira mais curta:
fonte
Ohhh, o horror da performance! A resposta está um pouco desatualizada, mas ainda assim ...
fonte
Strings são apenas matrizes de caracteres imutáveis
Você só precisa torná-lo mutável:
StringBuilder
unsafe
mundo e brinque com ponteiros (embora perigoso)e tente iterar pela matriz de caracteres a menor quantidade de vezes. Observe o
HashSet
aqui, pois evita atravessar a sequência de caracteres dentro do loop. Se você precisar de uma pesquisa ainda mais rápida, poderá substituirHashSet
por uma pesquisa otimizada parachar
(com base em umarray[256]
).Exemplo com StringBuilder
Editar - versão otimizada
Então você apenas o usa assim:
fonte
wchar_t
em .net, você está substituindo apenas um subconjunto de todos os possíveis caracteres (e você vai precisar 65536 bools para otimizar isso ...)Você também pode simplesmente escrever esses métodos de extensão de string e colocá-los em algum lugar da sua solução:
Chame-os assim:
E isto:
fonte
Use RegEx.Replace, algo como isto:
Aqui estão mais informações sobre esta documentação do MSDN para o RegEx.
fonte
Performance-Wise, isso provavelmente pode não ser a melhor solução, mas funciona.
fonte
fonte