Frage

Ich habe versucht, den folgenden Code in LINQPad und bekam die Ergebnisse unten angegeben:

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

"a" und "b"

so der Brief b nicht bekommen die white-space entfernt, wie ich es erwartet hatte ...?

Wer irgendwelche Ideen

[Anmerkung: die .dump () Methode ist eine Erweiterung menthod in LINQPad, die auf intelligente Weise formatierte Art und Weise in einer schönen, den Inhalt eines Objekts druckt]

War es hilfreich?

Lösung

Die String.Trim () Methode gibt eine Zeichenfolge, die die aktualisierten String repräsentiert. Es wird nicht das String-Objekt aktualisieren selbst, sondern schafft einen neuen.

Sie können dies tun:

s = s.Trim();

Sie können jedoch nicht eine Sammlung aktualisieren, während durch sie aufzählt, so dass Sie entweder wollen, würden eine neue Liste füllen, während der bestehende Aufzählen über oder die Liste füllen manuell das String-Array von String.Split zurückgegeben werden.

Füllen eine neue 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();

Bestücken von Manuell:

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

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

listFromSplit.Dump();

Andere Tipps

Sie nur eine getrimmte Zeichenfolge erstellen, nichts zu zuweisen.

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

wird s nicht aktualisieren, während ..

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

wird ..

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

würde, nehme ich an, sein, wie ich über sie gehen würde.

Im Anschluss an die Antwort von Adrian Kuhn Sie folgendes tun können:

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

Die Zeichenfolge Instanzen sind unveränderlich. Alles, was man zu ändern scheint, erstellt eine neue Instanz statt.

Sie sind nicht das zugeschnittene Ergebnis etwas zuweisen. Dies ist ein klassischer Fehler, ich habe gerade erst bekommt aus der Gewohnheit, diesen Fehler zu machen mit String.Replace:)

Ich habe keine IDE und laufen, aber dies sollte den Job erledigen (es sei denn, ich bin falsch):

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

Split auf beiden Räume und Komma und entfernen Sie alle leeren Einträge. Alle schön und getrimmt. Geht davon aus, dass die Saiten keine Leerzeichen enthalten, though.

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

Die Linq Optionen andere zur Verfügung gestellt haben sollten gut funktionieren. Als weitere Option ist, hier eine Erweiterungsmethode einer for-Schleife:

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

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

    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top