Pourquoi ma tentative de rognage de chaînes dans une liste < string > semble pas fonctionner?

StackOverflow https://stackoverflow.com/questions/205299

Question

J'ai essayé le code suivant dans LINQPad et obtenu les résultats suivants:

List<string> listFromSplit = new List<string>("a, b".Split(",".ToCharArray())).Dump();
listFromSplit.ForEach(delegate(string s) 
{ 
  s.Trim(); 
});
listFromSplit.Dump();
  

" a " et " b "

donc la lettre b n'a pas été supprimée de l'espace blanc comme je m'y attendais ...?

Tout le monde a des idées

[NOTE: la méthode .Dump () est une méthode d'extension dans LINQPad qui affiche le contenu de tout objet de manière intelligemment formatée.]

Était-ce utile?

La solution

La méthode String.Trim () renvoie une chaîne représentant la chaîne mise à jour. Il ne met pas à jour l'objet chaîne lui-même, mais en crée un nouveau.

Vous pouvez faire ceci:

s = s.Trim();

Cependant, vous ne pouvez pas mettre à jour une collection pendant l'énumération afin de remplir une nouvelle liste lors de l'énumération de la liste existante ou de la remplir manuellement à l'aide du tableau de chaînes renvoyé par String.Split.

Remplir une nouvelle liste:

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

Remplir manuellement:

string[] temp = "a, b".Split(",".ToCharArray());
List<string> listFromSplit = new List<string>();

foreach (string s in temp)
{
    listFromSplit.Add(s.Trim()); 
};

listFromSplit.Dump();

Autres conseils

vous créez simplement une chaîne coupée, sans rien lui attribuer.

var s = "  asd   ";
s.Trim();

ne mettra pas à jour s, tant que ..

var s = "   asd   ";
s = s.Trim();

sera ..

var listFromSplit = "a, b".Split(',').Select(s=>s.Trim());

serait, je suppose, comment je le ferais.

Suite à la réponse publiée par Adrian Kuhn vous pouvez effectuer les opérations suivantes:

var result = listFromSplit.Select(s => s.Trim());

Les instances de chaîne sont immuables. Tout ce qui semble en modifier une crée une nouvelle instance à la place.

Vous n'attribuez rien au résultat ajusté. C’est une erreur classique, je viens juste de prendre l’habitude de commettre cette erreur avec string.Replace:)

Je n'ai pas d'IDEA opérationnelle, mais cela devrait faire le travail (à moins que je ne me trompe):

var result = from each in listFromSplit select each.Trim();

Séparez les espaces et les virgules et supprimez les entrées vides. Tout gentil et équilibré. Suppose que vos chaînes ne contiennent pas d'espaces, cependant.

List<string> listFromSplit =
     new List<string>( "a , b ".Split( new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries ));

Les options linq fournies par d’autres devraient bien fonctionner. Une autre option est une méthode d’extension utilisant une boucle for:

    public static void TrimCollection(this IList<string> stringCollection) {

        for (int i = 0; i <= stringCollection.Count() - 1; i++)
            stringCollection[i] = stringCollection[i].Trim();

    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top