Ich versuche, eine bestimmte Anzahl von Einrückungen vor einer Zeichenfolge basierend auf der Tiefe eines Elements einzufügen, und frage mich, ob es eine Möglichkeit gibt, eine Zeichenfolge zurückzugeben, die X-mal wiederholt wird. Beispiel:
string indent = "---";
Console.WriteLine(indent.Repeat(0)); //would print nothing.
Console.WriteLine(indent.Repeat(1)); //would print "---".
Console.WriteLine(indent.Repeat(2)); //would print "------".
Console.WriteLine(indent.Repeat(3)); //would print "---------".
String
Klasse eine Zeichenfolge als Parameter, um daraus Wiederholungen zu erstellen, die die akzeptierte Antwort zu einer perfekten Anpassung hätten machen können.Antworten:
Wenn Sie nur dasselbe Zeichen wiederholen möchten, können Sie den Zeichenfolgenkonstruktor verwenden , der ein Zeichen akzeptiert, und wie oft es wiederholt werden soll
new String(char c, int count)
.Um beispielsweise einen Bindestrich fünfmal zu wiederholen:
quelle
Wenn Sie .NET 4.0 verwenden, können Sie es
string.Concat
zusammen mit verwendenEnumerable.Repeat
.Sonst würde ich mit so etwas wie Adams Antwort gehen .
Der Grund, warum ich Andreys Antwort im Allgemeinen nicht empfehlen würde , ist einfach, dass der
ToArray()
Anruf überflüssigen Overhead einführt, der mit demStringBuilder
von Adam vorgeschlagenen Ansatz vermieden wird. Das heißt, zumindest funktioniert es ohne .NET 4.0; und es ist schnell und einfach (und wird Sie nicht töten, wenn Effizienz kein allzu großes Problem darstellt).quelle
Console.WriteLine(string.Concat("-", string.Concat(Enumerable.Repeat(indent, N))));
quelle
input.Length * count
an denStringBuilder
Konstrukteur übergeben werden, meinst du nicht auch?input.Length * count
an denStringBuilder
Konstruktor übergeben, können Sie das Ganze überspringenStringBuilder
und sofort ein Zeichen [] mit der richtigen Größe erstellen.StringBuilder
, und der Code wäre weniger transparent.leistungsstärkste Lösung für String
quelle
Für viele Szenarien ist dies wahrscheinlich die sauberste Lösung:
Verwendung ist dann:
Dies baut auf anderen Antworten auf (insbesondere @ c0rds). Neben der Einfachheit weist es die folgenden Merkmale auf, die nicht alle anderen besprochenen Techniken gemeinsam haben:
StringBuilder
Vorbelegung durch Speicher.quelle
Verwenden Sie String.PadLeft , wenn Ihre gewünschte Zeichenfolge nur ein einziges Zeichen enthält.
Gutschrift hier fällig
quelle
string
Konstruktor, der eine nimmtchar
und einint
?String.PadLeft
Argumente umgekehrt. Dascount
kommt vor dem Polstercharakter.Sie können Ihre Zeichenfolge wiederholen (falls es sich nicht um ein einzelnes Zeichen handelt) und das Ergebnis wie folgt zusammenfassen:
quelle
Ich würde mich für die Antwort von Dan Tao entscheiden, aber wenn Sie .NET 4.0 nicht verwenden, können Sie so etwas tun:
quelle
quelle
Ich mag die Antwort. In diesem Sinne habe ich in der Vergangenheit Folgendes verwendet:
"" .PadLeft (3 * Einzug, '-')
Dies wird das Erstellen eines Einzugs erfüllen, aber technisch gesehen bestand die Frage darin, eine Zeichenfolge zu wiederholen. Wenn der String-Einzug so etwas wie> - <ist, würde dies sowie die akzeptierte Antwort nicht funktionieren. In diesem Fall sieht die Lösung von c0rd mit Stringbuilder gut aus, obwohl der Overhead von Stringbuilder sie möglicherweise nicht zur leistungsstärksten Lösung macht. Eine Möglichkeit besteht darin, ein Array von Zeichenfolgen zu erstellen, es mit Einrückungszeichenfolgen zu füllen und diese dann zu verknüpfen. Zu wissen:
Wir alle lieben eine clevere Lösung, aber manchmal ist einfach am besten.
quelle
Hinzufügen der Erweiterungsmethode, die ich in allen meinen Projekten verwende:
Hoffe, jemand kann davon Gebrauch machen ...
quelle
Überrascht ging niemand auf die alte Schule. Ich mache keine Ansprüche bezüglich dieses Codes, sondern nur zum Spaß:
quelle
Ich bin mir nicht sicher, wie dies funktionieren würde, aber es ist ein einfacher Code. (Ich habe es wahrscheinlich komplizierter erscheinen lassen als es ist.)
Wenn Sie die maximale Anzahl von Ebenen kennen, die Sie erwarten können, können Sie alternativ einfach ein Array deklarieren und darin indizieren. Sie möchten dieses Array wahrscheinlich statisch oder konstant machen.
quelle
Ich habe nicht genug Repräsentanten, um Adams Antwort zu kommentieren, aber der beste Weg, dies imo zu tun, ist folgender:
Sie müssen überprüfen, ob numTimes größer als Null ist. Andernfalls wird eine Ausnahme angezeigt.
quelle
Ich habe diese Lösung nicht gesehen. Ich finde es einfacher, wo ich mich gerade in der Softwareentwicklung befinde:
quelle
Für den allgemeinen Gebrauch eignen sich Lösungen mit der StringBuilder-Klasse am besten zum Wiederholen von Zeichenfolgen mit mehreren Zeichen. Es ist optimiert, um die Kombination einer großen Anzahl von Zeichenfolgen auf eine Weise zu handhaben, die eine einfache Verkettung nicht kann und die von Hand nur schwer oder gar nicht effizienter durchgeführt werden kann. Die hier gezeigten StringBuilder-Lösungen verwenden zum Abschluss O (N) -Iterationen, eine Flatrate, die proportional zur Häufigkeit der Wiederholung ist.
Für eine sehr große Anzahl von Wiederholungen oder wenn ein hohes Maß an Effizienz herausgepresst werden muss, ist es jedoch besser, etwas Ähnliches wie die Grundfunktionalität von StringBuilder zu tun, aber zusätzliche Kopien vom Ziel anstatt von der ursprünglichen Zeichenfolge zu erstellen. wie nachstehend.
Dies verdoppelt die Länge der Quell- / Zielzeichenfolge bei jeder Iteration, wodurch der Aufwand für das Zurücksetzen von Zählern bei jedem Durchlaufen der ursprünglichen Zeichenfolge gespart wird. Stattdessen kann die jetzt viel längere Zeichenfolge problemlos gelesen und kopiert werden, was moderne Prozessoren viel tun können effizienter.
Es verwendet einen Basis-2-Logarithmus, um zu ermitteln, wie oft die Länge der Zeichenfolge verdoppelt werden muss, und fährt dann so oft fort. Da der zu kopierende Rest jetzt kleiner ist als die Gesamtlänge, von der kopiert wird, kann er einfach eine Teilmenge dessen kopieren, was er bereits generiert hat.
Ich habe die Array.Copy () -Methode anstelle der Verwendung von StringBuilder verwendet, da das Kopieren des Inhalts des StringBuilder in sich selbst den Aufwand hätte, bei jeder Iteration einen neuen String mit diesem Inhalt zu erstellen. Array.Copy () vermeidet dies und arbeitet dennoch mit einer extrem hohen Effizienz.
Diese Lösung benötigt O (1 + log N) -Iterationen, eine Rate, die logarithmisch mit der Anzahl der Wiederholungen zunimmt (die Verdoppelung der Anzahl der Wiederholungen entspricht einer zusätzlichen Iteration), was eine erhebliche Einsparung gegenüber den anderen Methoden darstellt, die proportional zunehmen.
quelle
Ein weiterer Ansatz ist zu prüfen ,
string
wieIEnumerable<char>
und eine generische Erweiterungsmethode hat , die die Elemente in einer Auflistung um den angegebenen Faktor multiplizieren.Also in deinem Fall:
quelle
Drucken Sie eine Zeile mit Wiederholung.
quelle
Sie können dazu eine ExtensionMethod erstellen!
Oder mit der @ Dan Tao-Lösung:
quelle