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]

Foi útil?

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();

    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top