[Code Ramp UP] – Removendo vírgula no final de uma string

Olá! Baseando sempre em fatos, compartilho com vocês uma experiência simples e que boa parte dos developers esquecem que existe ou não sabem o uso quando vão trabalhar com strings.

Vamos lá.

Já vi em alguns métodos que recebem Strings com algum “caracter inútil” no final, que geralmente é resultado de uma concatenação, por exemplo a vírgula abaixo:

"pêra, uva, maçã, "

Um código que sempre aparece nessa hora é algo como abaixo:

StringBuilder sb = new StringBuilder("1, 2, 3, ");   

string resultado1 = sb.ToString(0, sb.Length - 2);
Console.WriteLine(resultado1);

E dá para resolver de maneira bem mais elegante e eficiente com o TrimEnd():

string resultado2 = sb.ToString().TrimEnd(',', ' ');
Console.WriteLine(resultado2);

Para melhorar o entendimento, imagine que você desenvolveu método que espera um array de até 4 parâmetros, concatena com vírgulas e monta uma string afim de imprimir em tela como abaixo:

private static string FormataString(Object[] vetor)
{
	StringBuilder parametros = new StringBuilder();
	parametros.AppendFormat("{0}, {1}, {2}, {3}", vetor);

	string frase = "Times escolhidos: ";
	StringBuilder fraseCompleta = new StringBuilder();
	fraseCompleta.AppendFormat("{0} {1}", frase, parametros);

	return fraseCompleta.ToString().TrimEnd(',', ' ');
}

Assim sendo, você poderá utilizar de um até quatro parâmetros sem precisar se preocupar com aquela “vírgula” do final.

Object[] vetor = {"Goiás", "Vila Nova", "Atlético", null};
Console.WriteLine(FormataString(vetor));

Dê uma olhada também no TrimStart(), para fazer o mesmo, só que no início da string. E para enfatizar, lembre-se que concatenações de string sempre com o StringBuilder, ok?! Comente e dê sugestões para o Code Ramp Up!

Não sabe o que é o Code Ramp Up?!
Leia aqui.

Diferença entre int.Parse() e Convert.ToInt()

Olá pessoal. Esses dias ocorreu essa dúvida e confesso que parei para ler a documentação e brincar. Apesar de “simples”, creio que tenha muito developer que acaba confundindo o uso ou achando que é “tudo a mesma coisa.

E já sendo bem direto, no funcionamento não temos nenhuma diferença. Eu disse no funcionamento. Onde a entrega do objetivo primário é “converter para inteiro”.

Se você tem uma string e você sabe que ela sempre será um número inteiro (por exemplo, se algum serviço web está te entregando um número inteiro em formato string), você pode usar o Int32.Parse().

Agora se você está recebendo dados de entrada enviados pelo usuário (um formulário web por exemplo), você deve usar o Int32.TryParse(), uma vez que este método permite um controle mais refinado da situação quando o usuário informa um valor inválido. Este controle fica claro quando é retornado 0 sempre que não há sucesso na conversão para inteiro (seja nulo, overflow, formato inválido, etc).

Já o Convert.ToInt32() recebe um objeto como argumento e invoca o método Int32.TryParse() quando ele descobre que o objeto recebido é uma string. Por isso que quando ele não consegue converter para inteiro ele retorna 0 e não lança o ArgumentNullException. Com isso vemos que o Convert.ToInt32() é provavelmente um pouquinho mais lento do que Int32.Parse() porque ele tem que verificar o seu tipo no argumento.

E falando dem performance, fiz um teste que faz 900.000.000 de conversões de uma string para int usando os três métodos. O resultado temos abaixo.

image

Veja que o TryParse() é o mais veloz e o ConvertTo o mais lento. O código está no GitHub e você pode baixar para testar na sua máquina.

Por fim, gostaria de recaptular que o Int32.Parse() e Int32.TryParse() só podem converter strings. Convert.ToInt32() pode trabalhar com qualquer classe que implementa IConvertible, sendo assim, se você passar uma string via Convert, o efeito será equivalente aos métodos Parse/TryParse, porém sabe-se agora que teremos uma sobrecarga extra para comparações de tipo e outras coisinhas. Portanto, se você estiver convertendo strings, TryParse() é provavelmente a melhor opção.

É pra não ter mais dúvidas.
Tem subjeções? Deixe seu comentário.

Abraço!