Was ist der beste Weg, um eine Zeichenfolge von \t
's in C # zu generieren?
Ich lerne C # und experimentiere mit verschiedenen Arten, dasselbe zu sagen.
Tabs(uint t)
ist eine Funktion, die a string
mit der t
Anzahl von \t
's zurückgibt
Zum Beispiel Tabs(3)
kehrt zurück"\t\t\t"
Welche dieser drei Implementierungsmethoden Tabs(uint numTabs)
ist die beste?
Das hängt natürlich davon ab, was "am besten" bedeutet.
Die LINQ-Version besteht nur aus zwei Zeilen, was sehr schön ist. Aber sind die Aufrufe zum Wiederholen und Aggregieren unnötig zeit- und ressourcenintensiv?
Die
StringBuilder
Version ist sehr klar, aber ist dieStringBuilder
Klasse irgendwie langsamer?Die
string
Version ist einfach, was bedeutet, dass sie leicht zu verstehen ist.Ist das überhaupt nicht wichtig? Sind sie alle gleich?
Dies sind alles Fragen, die mir helfen sollen, ein besseres Gefühl für C # zu bekommen.
private string Tabs(uint numTabs)
{
IEnumerable<string> tabs = Enumerable.Repeat("\t", (int) numTabs);
return (numTabs > 0) ? tabs.Aggregate((sum, next) => sum + next) : "";
}
private string Tabs(uint numTabs)
{
StringBuilder sb = new StringBuilder();
for (uint i = 0; i < numTabs; i++)
sb.Append("\t");
return sb.ToString();
}
private string Tabs(uint numTabs)
{
string output = "";
for (uint i = 0; i < numTabs; i++)
{
output += '\t';
}
return output;
}
Kehrt zurück
Und
Kehrt zurück
von...
Gibt es eine integrierte Funktion zum Wiederholen von Zeichenfolgen oder Zeichen in .net?
quelle
StruingBuilder
!string.Join
war im Beispiel schneller, da ein Leerzeichen verwendet wurde.string.Concat
ist angemessen, wenn kein Trennzeichen vorhanden ist.In allen Versionen von .NET können Sie eine Zeichenfolge folgendermaßen wiederholen:
Einen Charakter zu wiederholen,
new String('\t', count)
ist die beste Wahl. Siehe die Antwort von @CMS .quelle
Die beste Version ist sicherlich die eingebaute Methode:
Von den anderen Lösungen bevorzugen Sie die einfachste; Nur wenn sich dies als zu langsam herausstellt, streben Sie nach einer effizienteren Lösung.
Wenn Sie a verwendenUnsinn: Natürlich ist der obige Code effizienter.StringBuilder
und die resultierende Länge im Voraus kennen, dann verwenden Sie auch einen geeigneten Konstruktor. Dies ist viel effizienter, da nur eine zeitaufwändige Zuordnung erfolgt und keine unnötigen Daten kopiert werden.quelle
new string('\t', len)
zwischen 2x und 7x schneller als derStringBuilder
Ansatz. Warum ist das Ihrer MeinungStringBuilder
nach in diesem Fall effizienter?Erweiterungsmethoden:
quelle
Enumerable.Range(0, n).SelectMany(x => s)
kann durch eine einfache ersetzt werdenEnumerable.Repeat(s, n)
.SelectMany
Wille für jeden einzelnen Dummyx
gibt eine Folge vonchar
Werten an (seit denstring s
ImplementierungenIEnumerable<char>
), und alle diesechar
Folgen werden zu einer langenchar
Folge verkettet . Was Sie vorschlagen, wird stattdessen eine gebenIEnumerable<string>
. Es ist nicht das Gleiche.Enumerable.Repeat
musste ich die Zeichenfolgen miteinander verketten :string.Concat(Enumerable.Repeat(s, n))
. Dies wurde bereits zuvor gepostet .Was ist mit der Erweiterungsmethode?
Sie könnten dann schreiben:
Beachten Sie, dass ein Leistungstest der Verwendung der Stringbuilder-Version für einfache Zeichen anstelle von Zeichenfolgen zu einer erheblichen Leistungsminderung führt: Auf meinem Computer beträgt der Unterschied in der gemessenen Leistung 1:20 zwischen: Debug.WriteLine ('-'. Repeat (1000000)) // char version und
Debug.WriteLine ("-". Repeat (1000000)) // string version
quelle
StringBuilder.Insert(Int32, String, Int32)
, wie Binoj Anthony antwortete .Wie wäre es damit:
quelle
new string('\t', 10)
ich die beste LösungIch weiß, dass diese Frage bereits fünf Jahre alt ist, aber es gibt eine einfache Möglichkeit, eine Zeichenfolge zu wiederholen, die sogar in .Net 2.0 funktioniert.
So wiederholen Sie eine Zeichenfolge:
Kehrt zurück
So wiederholen Sie eine Zeichenfolge als Array:
Kehrt zurück
Halte es einfach.
quelle
Angenommen, Sie möchten '\ t' n so oft wiederholen, wie Sie verwenden können.
quelle
Ihr erstes Beispiel, das verwendet
Enumerable.Repeat
:kann kompakter umgeschrieben werden mit
String.Concat
:quelle
Verwenden
String.Concat
undEnumerable.Repeat
das ist billiger als verwendenString.Join
quelle
quelle
Die Antwort hängt wirklich von der gewünschten Komplexität ab. Zum Beispiel möchte ich alle meine Einrückungen mit einem vertikalen Balken umreißen, sodass meine Einrückungszeichenfolge wie folgt bestimmt wird:
quelle
Und noch eine andere Methode
quelle
StringBuilder
Konstruktor wird eine Neuzuweisung gespeichert. Dies ist jedoch gesprächiger und weniger effizient als die Verwendung desstring
Konstruktors, der ein bestimmtes Zeichen wiederholen kann, wie bereits in der akzeptierten Antwort gezeigt.Für mich ist in Ordnung:
quelle
Sie können eine Erweiterungsmethode erstellen
Dann können Sie es so verwenden
quelle
Ohne Zweifel ist die akzeptierte Antwort der beste und schnellste Weg, um ein einzelnes Zeichen zu wiederholen.
Die Antwort von Binoj Anthony ist eine einfache und recht effiziente Möglichkeit, eine Zeichenfolge zu wiederholen.
Wenn Ihnen jedoch etwas mehr Code nichts ausmacht, können Sie meine Array-Fülltechnik verwenden, um diese Zeichenfolgen noch schneller effizient zu erstellen. In meinen Vergleichstests wurde der folgende Code in etwa 35% der Zeit des StringBuilder.Insert-Codes ausgeführt.
Weitere Informationen zu dieser Array-Fülltechnik finden Sie unter Schnellste Methode zum Füllen eines Arrays mit einem einzelnen Wert
quelle
Versuche dies:
quelle
Obwohl ich einem früheren Vorschlag sehr ähnlich bin, möchte ich ihn einfach halten und Folgendes anwenden:
Standard .Net wirklich,
quelle