Estou chamando uma API REST e estou recebendo uma resposta XML de volta. Ele retorna uma lista dos nomes de um espaço de trabalho e estou escrevendo um IsExistingWorkspace()
método rápido . Como todos os espaços de trabalho consistem em caracteres contíguos sem espaço em branco, estou assumindo que a maneira mais fácil de descobrir se um espaço de trabalho específico está na lista é remover todos os espaços em branco (incluindo novas linhas) e fazer isso (XML é a string recebida da Web solicitação):
XML.Contains("<name>" + workspaceName + "</name>");
Eu sei que diferencia maiúsculas de minúsculas e estou confiando nisso. Eu só preciso de uma maneira de remover todo o espaço em branco em uma string de forma eficiente. Eu sei que o RegEx e o LINQ podem fazer isso, mas estou aberto a outras idéias. Estou principalmente preocupado apenas com velocidade.
fonte
Respostas:
Esta é a maneira mais rápida que eu conheço, mesmo que você tenha dito que não queria usar expressões regulares:
fonte
Regex.Replace(XML, @"\s+", "")
?private static readonly Regex sWhitespace = new Regex(@"\s+"); public static string ReplaceWhitespace(string input, string replacement) { return sWhitespace.Replace(input, replacement); }
\s
significa "corresponder a qualquer token de espaço em branco" e+
significa "corresponder a um ou mais do token de processo". Além disso, o RegExr é um ótimo site para praticar a escrita de expressões RegEx, se você quiser experimentar.Eu tenho uma maneira alternativa sem regexp, e parece ter um bom desempenho. É uma continuação da resposta de Brandon Moretz:
Eu testei em um teste de unidade simples:
Para 1.000.000 de tentativas, a primeira opção (sem regexp) é executada em menos de um segundo (700 ms na minha máquina) e a segunda leva 3,5 segundos.
fonte
.ToCharArray()
não é necessário; você pode usar.Where()
diretamente em uma string.ToCharArray
é mais rápido do que o uso.Where()
direto na string. Isso tem algo a ver com a sobrecarga naIEnumerable<>
etapa de cada iteração, e com aToCharArray
eficiência (cópia em bloco) e o compilador otimiza a iteração sobre as matrizes. Por que essa diferença existe, ninguém foi capaz de me explicar, mas meça antes de removerToCharArray()
.Tente o método de substituição da string em C #.
fonte
Minha solução é usar o Split and Join e é surpreendentemente rápido, na verdade, a mais rápida das principais respostas aqui.
Horários para 10.000 loop em cadeia simples com espaço em branco, incluindo novas linhas e tabulações
Para melhorar isso, envolva-o no método para lhe dar significado e também faça dele um método de extensão enquanto estamos nisso ...
fonte
string[]
echar[]
? você apenas tem que especificar qual deles você deseja, por exemplo:string.Join("", str.Split((string[])null, StringSplitOptions.RemoveEmptyEntries));
. Na verdade, é o que a sua chamadadefault
faz nesse caso, pois também retornanull
: ajuda o compilador a decidir qual sobrecarga escolher. Daí o meu comentário porque a declaração no seu comentário "Split precisa de uma matriz válida e nula não funciona ..." é falsa. Não é grande coisa, só pensei em mencionar uma vez que Jake Drew perguntou como isso funcionava. +1 para a sua respostastring.Concat("H \ne llo Wor ld".Split())
Com base na resposta de Henks , criei alguns métodos de teste com sua resposta e alguns métodos adicionados e mais otimizados. Descobri que os resultados diferem com base no tamanho da string de entrada. Portanto, testei com dois conjuntos de resultados. No método mais rápido, a fonte vinculada tem uma maneira ainda mais rápida. Mas, como é caracterizado como inseguro, deixei isso de fora.
Resultados de cadeia de entrada longa:
Resultados curtos da string de entrada:
Código :
Testes :
Edit : Testado um belo liner do Kernowcode.
fonte
Apenas uma alternativa, porque parece bastante agradável :) - NOTA: A resposta de Henks é a mais rápida delas.
Testando 1.000.000 de loops em
"This is a simple Test"
Este método = 1,74 segundos
Regex = 2,58 segundos
new String
(Henks) = 0,82fonte
Encontrei um ótimo artigo sobre isso no CodeProject de Felipe Machado (com a ajuda de Richard Robertson )
Ele testou dez métodos diferentes. Esta é a versão insegura mais rápida ...
E a versão mais rápida e segura ...
Existem também alguns bons benchmarks independentes no Stack Overflow de Stian Standahl que também mostram como a função de Felipe é cerca de 300% mais rápida que a próxima função mais rápida.
fonte
Se você precisar de um desempenho excelente, evite o LINQ e as expressões regulares nesse caso. Fiz alguns testes de desempenho e parece que, se você deseja remover o espaço em branco do início e do fim da string, string.Trim () é sua função final.
Se você precisar remover todos os espaços em branco de uma sequência, o método a seguir funcionará mais rapidamente do que foi postado aqui:
fonte
Regex é um exagero; basta usar extensão na string (obrigado Henk). Isso é trivial e deveria ter sido parte da estrutura. De qualquer forma, aqui está a minha implementação:
fonte
System.Linq
Aqui está uma alternativa linear simples à solução RegEx. Não tenho certeza do que é mais rápido; você teria que compará-lo.
fonte
Eu precisava substituir o espaço em branco em uma string por espaços, mas não espaços duplicados. por exemplo, eu precisava converter algo como o seguinte:
para
Eu usei o seguinte método
fonte
Presumo que sua resposta XML seja assim:
A melhor maneira de processar XML é usar um analisador XML, como LINQ to XML :
fonte
Aqui está mais uma variante:
Como na maioria das outras soluções, não realizei testes exaustivos de benchmark, mas isso funciona bem o suficiente para meus propósitos.
fonte
Podemos usar:
fonte
null
.Eu encontrei resultados diferentes para ser verdade. Estou tentando substituir todo o espaço em branco por um único espaço e o regex era extremamente lento.
O que funcionou da melhor maneira para mim (em C ++ cli) foi:
Tentei a rotina acima primeiro substituindo cada caractere separadamente, mas tive que mudar para fazer substrings para as seções não espaciais. Ao aplicar a uma cadeia de 1.200.000 caracteres:
fonte