5 Stimmen

Warum scheint mein Versuch, Strings in einer List<string> zu trimmen, nicht zu funktionieren?

Ich habe den folgenden Code in LINQPad ausprobiert und die unten angegebenen Ergebnisse erhalten:

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

"a" und "b"

Der Buchstabe b wurde also nicht, wie ich erwartet hatte, aus dem Leerraum entfernt...?

Hat jemand eine Idee?

[HINWEIS: die .Dump()-Methode ist eine Erweiterungsmethode in LINQPad, die den Inhalt eines beliebigen Objekts in einer schönen, intelligent formatierten Weise ausgibt]

17voto

Sciolist Punkte 1809

Erstellen Sie nur eine beschnittene Zeichenfolge, ohne ihr etwas zuzuweisen.

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

wird nicht aktualisiert, während..

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

wird.

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

wäre, so nehme ich an, wie ich vorgehen würde.

10voto

akmad Punkte 18503

Die Methode String.Trim() gibt eine Zeichenfolge zurück, die die aktualisierte Zeichenfolge darstellt. Sie aktualisiert nicht das String-Objekt selbst, sondern erstellt ein neues.

Sie könnten dies tun:

s = s.Trim();

Sie können eine Sammlung jedoch nicht aktualisieren, während Sie sie aufzählen. Sie müssen also entweder eine neue Liste füllen, während Sie die bestehende aufzählen, oder die Liste manuell mit dem von String.Split zurückgegebenen String-Array auffüllen.

Füllen einer neuen 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();

Manuelles Befüllen:

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

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

listFromSplit.Dump();

4voto

mezoid Punkte 27286

Im Anschluss an die Antwort von Adrian Kuhn könnten Sie Folgendes tun:

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

2voto

Pablo Marambio Punkte 1543

Die String-Instanzen sind unveränderlich. Alles, was eine Instanz zu verändern scheint, erzeugt stattdessen eine neue Instanz.

1voto

Sie ordnen das abgeschnittene Ergebnis nichts zu. Dies ist ein klassischer Fehler. Ich habe mir gerade erst abgewöhnt, diesen Fehler mit string.Replace zu machen :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X