Effizienteste Weg von verbinden von strings
Brauche ich zum verketten einer Menge von Zeichenketten insgesamt und setzen Sie ein Komma zwischen jedem von Ihnen.
Ich habe eine Liste von strings
"123123123213"
"1232113213213"
"123213123"
und ich will mich
"123123123213,1232113213213,123213123"
Ich Frage mich, was ist der beste Weg, das zu erreichen.
Könnte ich das in etwa so machen:
private List<string> stringList = new List<string> {
//a lot of strings in here
"1234567890", "34343434", "4343434" };
string outcome = string.Join(",", stringList.ToArray());
Oder vielleicht:
StringBuilder builder = new StringBuilder();
stringList.ForEach(val => {
builder.Append(val);
builder.Append(",");
});
string outcome = builder.ToString();
Welcher Weg ist besser? Kennen Sie bessere Möglichkeiten zum verketten von strings?
- Verwandte oder vielleicht dupliziert: stackoverflow.com/q/3102806/340760
- Warum nicht, testen Sie die Leistung selbst?
- Sie nicht angeben, welche Mittel am besten. Ich habe die Leistung - tag zu Ihrer Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als @Ekkehard sagte, verwenden Sie die string.Beitreten.
Jedoch, Sie brauchen nicht die
ToArray()
weilstring.Join
hat eine überlastung fürIEnumerable<string>
.BEARBEITEN
Als @Kobi gesagt, dies funktioniert nur, C# 4.0. Bei 3.5 würde ich das tun.
Sollten Sie verwenden
string.Join()
weil:a) es ist sehr viel besser lesbar, wartbar und einfach auf die Augen.
b) er verwendet ein
StringBuilder
intern bereits, so dass es sehr effizient ist ( Sie kann bestätigen, sich mit dem Reflektor).Edit:
string.Join()
verwendet eineStringBuilder
für den Allgemeinen Fall einesIEnumerable<T>
Eingang. Wenn Sie bereits über ein array auf der anderen Seite verwendet er eine Art voodoo-Zauber (einschließlichFastAllocateString()
undUnSafeCharBuffer
) noch schneller.string.Join(string, string[])
nicht verwendenStringBuilder
, aberUnSafeCharBuffer
.Join, weil es doesn ' T fügen Sie einen trailing ",".
Gibt es einen benchmark auf auf dieser Seite, die scheint zu zeigen, dass
string.Join
besser abschneidet als derStringBuilder
auf einem kleinen array in eine Menge von Iterationen. Sie sollte wohl benchmark für größere arrays auch. Als ich dieses posting sehe ich, dass BrokenGlass antwortete, dassStringBuilder
wird intern verwendet, instring.Join
so können Sie erwarten, dass es schneller sein, denke ich.Deine zweite Lösung fügt eine zusätzliche
,
am Ende. Werfen Sie einen Blick auf Eric Lippert ' s blog EintragIch würde empfehlen, die Befestigung der zweiten Lösung. Ein StringBuilder-Objekt wäre auf jeden Fall schneller, als Sie vermeiden coping-die Inhalte der Liste in einem neuen array.
StringBuilder ist eine sehr effiziente Art und Weise und zu empfehlen wäre hier.
string.Join()
noch effektiver (zumindest in dem Fall, geben, wenn Sie esstring[]
sein, sonst ist verwendetStringBuilder
selbst).StringBuilder
cleverer als die mitstring.Join()
? Die letztere ist viel übersichtlicher, weniger fehleranfällig (Sie müssen nicht Ihren eigenen code schreiben) und möglicherweise schneller.Gemäß dem folgenden test, den ich gemacht habe, Join ist 3x schneller auf große arrays:
Den
Text.txt
- Datei enthält den Wert"aaaaaaaaaaaaaaaaaaa"
auf 38400 Linien:Ausgabe:
String.Beitreten ist das am schnellsten, wenn Sie haben eine Feste Anzahl von strings zu verbinden. Der tiefere Grund ist, dass String.Verknüpfung wird-Schleife über das array und ordnet die final string Puffer mit der richtigen Größe, weil es im ersten Durchgang fügen Sie die Zeichenfolge der Länge aller strings zusammen. Sie können ähnliche Ergebnisse erhalten, wenn Sie spielen, um mit StringBuilder und seine Kapazität. Die goldene Regel ist, spare-Speicher Zuweisungen an den Kosten der Schleife über das array zwei mal. Welcher Ansatz schneller ist, hängt davon ab, wie viele Elemente, die Sie in Ihrer Liste haben und wie groß die resultint string erhalten.
Yours,
Alois Kraus
Test-code:
Ergebnis 1.
String.Join
- 2.StringBuilder + SubString
.####ms (ticks)
In diesem Fall
String.Join
ist schneller, aber wenn Sie sind ok mit einem nachgestellten,
dannStringBuilder
ist etwas schneller (mit einem nachgestellten,
).Dieser ad-hoc-Implementierung habe ich versucht mit dem StrignBuilder ist schneller als String.Join.
Mehr als die Zeichenkette.Join ist ein Speicherfresser.
Ich habe versucht, mit 20000000 strings und String.Join gibt immer OutOfMemory, wenn meine Anwendung beendet.
Auf Ihrem Rechner kann Es auch auf weniger Saiten, wenn Sie weniger als 8 GB Arbeitsspeicher.
Kommentar einer der Implementierungen zu testen.
Dies gilt, es sei denn, Sie verwenden einen festen string [] - array. String.Beitreten ist gut.
Wenn man will cool sein und laufen auf Schweröl Verwendung Aggregierter