Ich habe folgendes
data.AppendFormat("{0},",dataToAppend);
Das Problem dabei ist, dass ich es in einer Schleife verwende und es ein Komma gibt. Was ist der beste Weg, um das nachfolgende Komma zu entfernen?
Muss ich Daten in eine Zeichenfolge ändern, die Teilzeichenfolge enthält?
c#
stringbuilder
Wesley Skeen
quelle
quelle
string.Join(",", yourCollection)
? Bearbeiten: als Antwort hinzugefügt.Antworten:
Der einfachste und effizienteste Weg besteht darin, diesen Befehl auszuführen:
Auf diese Weise verschieben Sie den Zeiger (dh den letzten Index) um ein Zeichen zurück, ändern jedoch nicht die Veränderlichkeit des Objekts. Tatsächlich ist das Löschen von a
StringBuilder
am besten auch mitLength
(verwenden Sie dieClear()
Methode jedoch aus Gründen der Klarheit, da die Implementierung so aussieht):wieder, weil es die Zuordnungstabelle nicht ändert. Stellen Sie sich vor, Sie möchten diese Bytes nicht mehr erkennen. Selbst wenn er anruft
ToString()
, erkennt er nichts mehr als das , wasLength
er kann. Es ist ein veränderliches Objekt, das mehr Speicherplatz zuweist als Sie bereitstellen. Es ist einfach so aufgebaut.quelle
data.Length = 0;
: Das ist genau dasStringBuilder.Clear
, was es tut, daher ist esStringBuilder.Clear
aus Gründen der Klarheit der Absicht vorzuziehen, es zu verwenden .Clear()
macht, aber lustige Sache. Das ist die erste Zeile derClear()
Methode. Aber wussten Sie, dass die Schnittstelle tatsächlich dann a ausgibtreturn this;
. Das bringt mich um. Wenn Sie dieLength = 0
Änderungen auf die Referenz einstellen, die Sie bereits haben, warum sollten Sie sich selbst zurückgeben?Append
kehrt auch zurück.Benutz einfach
Auf diese Weise benötigen Sie die
StringBuilder
und die Schleife nicht.Langer Zusatz zum asynchronen Fall. Ab 2019 ist es keine seltene Einrichtung, wenn die Daten asynchron kommen.
Wenn sich Ihre Daten in einer asynchronen Sammlung befinden, erfolgt keine
string.Join
ÜberlastungIAsyncEnumerable<T>
. Es ist jedoch einfach, einen manuell zu erstellen und den Code zustring.Join
hacken von :Wenn die Daten asynchron kommen, die Schnittstelle
IAsyncEnumerable<T>
jedoch nicht unterstützt wird (wie in den Kommentaren erwähntSqlDataReader
), ist es relativ einfach, die Daten in Folgendes zu verpackenIAsyncEnumerable<T>
:und benutze es:
Um verwenden zu können
Select
, müssen Sie das Nuget-Paket verwendenSystem.Interactive.Async
. Hier finden Sie ein kompilierbares Beispiel.quelle
string.Join(",", yourCollection)
hat noch ein,
am ende. Das oben Genanntestring.Join(",", yourCollection)
ist also ineffizient und entfernt es nicht von alleine.Verwenden Sie nach der Schleife Folgendes.
oder einfach zu wechseln
quelle
string.Join(",", input)
Wie wäre es damit..
quelle
Ich bevorzuge es, die Länge des Stringbuilders zu manipulieren:
quelle
data.Length--
oder--data.Length
?--
oder++
Sie können es jedoch verwendendata.Length -= 1
, oder diese Antwort funktioniert auch.Ich empfehle Ihnen, Ihren Schleifenalgorithmus zu ändern:
quelle
Sie sollten die
string.Join
Methode verwenden, um eine Sammlung von Elementen in eine durch Kommas getrennte Zeichenfolge umzuwandeln. Dadurch wird sichergestellt, dass kein führendes oder nachfolgendes Komma vorhanden ist, und es wird sichergestellt, dass die Zeichenfolge effizient aufgebaut ist (ohne unnötige Zwischenzeichenfolgen).quelle
Ja, konvertieren Sie es nach Abschluss der Schleife in einen String:
quelle
Sie haben zwei Möglichkeiten. Erstens ist eine sehr einfach zu bedienen
Remove
Methode, die sehr effektiv ist. Die zweite Möglichkeit ist die VerwendungToString
mit Startindex und Endindex ( MSDN-Dokumentation ).quelle
Ähnliche SO Frage hier.
Mir hat die Verwendung einer StringBuilder-Erweiterungsmethode gefallen.
RemoveLast-Methode
quelle
Am einfachsten wäre es, die Join () -Methode zu verwenden:
Wenn Sie den StringBuilder wirklich benötigen, schneiden Sie das Endkomma nach der Schleife ab:
quelle
data.ToString().TrimEnd(',');
ist ineffizient