Por que a minha tentativa de cortar cordas em um List não aparecem para trabalhar?
-
03-07-2019 - |
Pergunta
Eu tentei o seguinte código no LINQPad e obteve os resultados abaixo:
List<string> listFromSplit = new List<string>("a, b".Split(",".ToCharArray())).Dump();
listFromSplit.ForEach(delegate(string s)
{
s.Trim();
});
listFromSplit.Dump();
"a" e "b"
de modo a letra b não conseguiu o espaço em branco removido como eu estava esperando ...?
Alguém tem alguma idéia
[NOTA: o .dump () método é uma menthod extensão no LINQPad que imprime o conteúdo de qualquer objeto em uma boa maneira inteligente formatado]
Solução
O String.Trim () retorna uma string representando a string atualizada. Ela não atualiza o próprio objeto string, mas sim cria um novo.
Você pode fazer isso:
s = s.Trim();
No entanto, você não pode atualizar uma coleção ao enumerar através dele para que você iria querer quer preencher uma nova lista ao enumerar sobre outra já existente ou preencher a lista manualmente usando a matriz de cadeia retornado por String.Split.
Preencher uma nova lista:
List<string> temp = new List<string>("a, b".Split(",".ToCharArray()));
List<string> listFromSplit = new List<string>();
temp.ForEach(delegate(string s)
{
listFromSplit.Add(s.Trim());
});
listFromSplit.Dump();
Preenchendo Manualmente:
string[] temp = "a, b".Split(",".ToCharArray());
List<string> listFromSplit = new List<string>();
foreach (string s in temp)
{
listFromSplit.Add(s.Trim());
};
listFromSplit.Dump();
Outras dicas
você está apenas criando uma corda cortada, não atribuir qualquer coisa a ele.
var s = " asd ";
s.Trim();
não irá atualizar s, enquanto ..
var s = " asd ";
s = s.Trim();
vai ..
var listFromSplit = "a, b".Split(',').Select(s=>s.Trim());
seria, suponho, seja como eu iria sobre isso.
Na sequência da resposta postado por Adrian Kuhn você poderia fazer o seguinte:
var result = listFromSplit.Select(s => s.Trim());
As instâncias de cordas são imutáveis. Qualquer coisa que parece modificar um, cria uma nova instância vez.
Você não está atribuindo o resultado cortado para qualquer coisa. Este é um erro clássico, eu só acabei de sair do hábito de fazer este erro com String.Replace:)
Eu não tenho nenhuma IDE instalado e funcionando, mas isso deve começar o trabalho feito (a não ser que eu esteja errado):
var result = from each in listFromSplit select each.Trim();
Split em ambos os espaços e vírgulas e remova quaisquer entradas vazias. Todos agradável e aparado. Assume que as cordas não contêm espaços, no entanto.
List<string> listFromSplit =
new List<string>( "a , b ".Split( new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries ));
As opções LINQ outros forneceram deve funcionar bem. Como outra opção, aqui é um método de extensão usando um loop for:
public static void TrimCollection(this IList<string> stringCollection) {
for (int i = 0; i <= stringCollection.Count() - 1; i++)
stringCollection[i] = stringCollection[i].Trim();
}