1026 Stimmen

Beste Möglichkeit, ein Zeichen in C# zu wiederholen

Wie kann man am besten eine Zeichenkette aus \t 's in C#

Ich lerne gerade C# und experimentiere mit verschiedenen Möglichkeiten, das Gleiche zu sagen.

Tabs(uint t) ist eine Funktion, die eine string con t Betrag von \t 's

Zum Beispiel Tabs(3) gibt zurück. "\t\t\t"

Welche dieser drei Möglichkeiten der Umsetzung Tabs(uint numTabs) am besten ist?

Das hängt natürlich davon ab, was "am besten" bedeutet.

  1. Die LINQ-Version besteht nur aus zwei Zeilen, was sehr angenehm ist. Aber sind die Aufrufe von Repeat und Aggregate unnötig zeit- und ressourcenaufwändig?

  2. Le site StringBuilder Version ist sehr klar, aber ist die StringBuilder Klasse irgendwie langsamer?

  3. Le site string Version ist einfach, d. h. sie ist leicht zu verstehen.

  4. Spielt das überhaupt keine Rolle? 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; 
}

1voto

Grax32 Punkte 3763

Zweifellos ist die akzeptierte Antwort der beste und schnellste Weg, ein einzelnes Zeichen zu wiederholen.

Die Antwort von Binoj Anthony ist ein einfacher und recht effizienter Weg, eine Zeichenkette zu wiederholen.

Wenn Sie jedoch nichts gegen ein wenig mehr Code haben, können Sie meine Array-Fülltechnik verwenden, um diese Zeichenketten noch schneller zu erstellen. In meinen Vergleichstests wurde der folgende Code in etwa 35 % der Zeit des StringBuilder.Insert-Codes ausgeführt.

public static string Repeat(this string value, int count)
{
    var values = new char[count * value.Length];
    values.Fill(value.ToCharArray());
    return new string(values);
}

public static void Fill<T>(this T[] destinationArray, params T[] value)
{
    if (destinationArray == null)
    {
        throw new ArgumentNullException("destinationArray");
    }

    if (value.Length > destinationArray.Length)
    {
        throw new ArgumentException("Length of value array must not be more than length of destination");
    }

    // set the initial array value
    Array.Copy(value, destinationArray, value.Length);

    int copyLength, nextCopyLength;

    for (copyLength = value.Length; (nextCopyLength = copyLength << 1) < destinationArray.Length; copyLength = nextCopyLength)
    {
        Array.Copy(destinationArray, 0, destinationArray, copyLength, copyLength);
    }

    Array.Copy(destinationArray, 0, destinationArray, copyLength, destinationArray.Length - copyLength);
}

Mehr über diese Technik zum Füllen von Arrays finden Sie unter Der schnellste Weg, ein Array mit einem einzigen Wert zu füllen

-1voto

Toso Pankovski Punkte 31

Versuchen Sie dies:

  1. Microsoft.VisualBasic-Referenz hinzufügen
  2. Verwendung: String result = Microsoft.VisualBasic.Strings.StrDup(5, "hi");
  3. Lassen Sie mich wissen, ob es bei Ihnen funktioniert.

-1voto

Porky Punkte 750

Auch wenn es einem früheren Vorschlag sehr ähnlich ist, halte ich es gerne einfach und wende das Folgende an:

string MyFancyString = "*";
int strLength = 50;
System.Console.WriteLine(MyFancyString.PadRight(strLength, "*");

Standard .Net wirklich,

-1voto

David Morrow Punkte 183

Füllen Sie den Bildschirm mit 6.435 z's $str = [System.Linq.Enumerable]::Repeat([string]::new("z", 143), 45)

$str

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X