Pourquoi ma tentative de rognage de chaînes dans une liste < string > semble pas fonctionner?
-
03-07-2019 - |
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.]
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();
}