2009-11-11 6 views
20

Ich frage mich, ob es mehr Möglichkeiten gibt, Leerzeichen in C# zu erstellen.Alternativen zu "" zum Erstellen von Strings, die mehrere Leerzeichen enthalten

Buchstäblich Space Code!

Ich habe derzeit tabs += new String(" "); und ich kann nicht helfen, aber ich fühle, dass dies erinnert an die Verwendung "" anstelle von String.Empty.

Was kann ich verwenden, um Leerzeichen zu erstellen, die nicht " " sind?

+3

Was ist mit '' '' falsch? –

+8

Und es ist nichts falsch mit "" "anstatt" string.Empty "entweder. – LukeH

+0

Ich glaube nicht, dass irgendetwas als solches "falsch" ist. Ich frage mich nur, ob es noch einen anderen Weg gibt, das ist vielleicht mehr ... OO ... ich wage es zu sagen. –

Antwort

39

Sie können

" " 

statt

new String(' ') 

Hilft schreiben?


Je nachdem, was Sie tun, sollten Sie in die StringBuilder.Append Überlastung suchen, die einen Charakter annimmt und eine ‚Wiederholung‘ zählen:

var tabs = new StringBuilder(); 
tabs.Append(' ', 8); 

oder in die stringconstructor, die einen String-Konstrukte aus ein Zeichen a 'wiederholen' zählen:

var tabs = new string(' ', 8); 

Hier ist eine enterprisey OO-Lösung all Ihre Bedürfnisse Raum Generation zu erfüllen:

public abstract class SpaceFactory 
{ 
    public static readonly SpaceFactory Space = new SpaceFactoryImpl(); 

    public static readonly SpaceFactory ZeroWidth = new ZeroWidthFactoryImpl(); 

    protected SpaceFactory { } 

    public abstract char GetSpace(); 

    public virtual string GetSpaces(int count) 
    { 
     return new string(this.GetSpace(), count); 
    } 

    private class SpaceFactoryImpl : SpaceFactory 
    { 
     public override char GetSpace() 
     { 
      return '\u0020'; 
     } 
    } 

    private class ZeroWidthFactoryImpl : SpaceFactory 
    { 
     public override char GetSpace() 
     { 
      return '\u200B'; 
     } 
    } 
} 
+0

In meinem eigentlichen Code mache ich neue String ('', numberOfSpaces), also muss ich wahrscheinlich noch den neuen String-Teil verwenden. –

+8

@Jamie: Es wäre nützlich gewesen, das zu sagen, weil es im Prinzip alle vorhandenen Antworten ungültig macht. –

+0

Yeah Appologien dafür. Ich denke, dass andere Leute diese Frage irgendwann haben könnten, und diese Leute geben vielleicht nicht die Anzahl der Leerzeichen an, daher denke ich, dass diese Antworten für sie nützlich sein werden. –

3

Je nachdem, wie weit verbreitet diese in Ihrem Code ist, kann der String Weg besser sein.

StringBuilder tabs = new StringBuilder(); 
... 

tabs.Append(" "); 

Sie können auch in der konstanten mischen ...

StringBuilder tabs = new StringBuilder(); 
const string SPACE = " "; 
... 

tabs.Append(SPACE); 
8

wenn die Anzahl der Räume zu ändern würde, dann könnte man so etwas tun:

public static string Space(int count) 
{ 
    return "".PadLeft(count); 
} 

Space(2); 
+1

Schön, aber ich würde String.Empty verwenden, um seine Abneigung gegen Strings im Code zu befriedigen! –

+2

Oder verwenden Sie den Zeichenfolgenkonstruktor, der stattdessen eine Zeichenanzahl akzeptiert: 'return new string ('', count);' – LukeH

2

verlängern Zeichenfolge geben Sie eine Methode, um Speicherplatz hinzuzufügen

public static string AddSpace(this String text, int size) 
{ 
    return text + new string(' ', size) 
} 

Schrecklich in sich selbst.

+1

+1 - Erweiterungsmethoden scheinen hier mit dem OP-Stil übereinzustimmen. Beachten Sie, dass Sie den Rumpf dieser Funktion durch 'return new String ('', count);' ersetzen können, da dieser überladene Konstruktor genau das tut, was Sie getan haben. –

+1

Auch wenn eine Erweiterungsmethode gewünscht wird, müssen Sie sie nicht verwenden wiederholte String-Verkettung wie folgt. "return text + new string ('', size)" wäre IMO besser geeignet. (Nachdem der erste Parameter vom Schlüsselwort 'string' in' text' geändert wurde ...) –

+0

Danke John und Jon (sorry Tony). Ja, das fühlt sich viel besser an, da ich ein Web-BOD bin, möchte ich sowieso nur selten zwei nebeneinander liegende Räume haben, dachte nur, ich würde meinen zwei-Pence-Wert hinzufügen. –

5

Es gibt keinen Grund, dies zu tun. Alles andere ist gleich, smaller code is better code. String.Empty und new String(' ') kommunizieren die gleiche Sache wie "" und " ", sie nehmen nur mehr Zeichen, um es zu tun.

Der Versuch, es "mehr OO" zu machen, fügt nur Zeichen ohne Nutzen hinzu. Objektorientierung ist kein Selbstzweck.

1

Wenn die Sprache für sie erlaubt können Sie eine Erweiterungseigenschaft auf den Typ String hinzufügen, die war Raum, so etwas wie:

public static class StringExt 
{ 
    public static char Space(this String s) 
    { 
     get { 
      return ' '; 
     } 
    } 
} 

aber das ist nicht möglich. Ich denke, es wäre besser, den Raum innerhalb des Eigentums zu behalten, wenn es ein lokalisierbares Ding wäre, aber ich denke, dass Räume überall in allen Sprachen allgemein sind.

14

Jetzt, wo Sie in den Kommentaren geklärt haben:

In meinem eigentlichen Code Ich mache neuen String (‘‘, numberOfSpaces), damit ich brauche wahrscheinlich noch den neuen String Teil zu verwenden.

... die anderen Antworten sind bisher effektiv nutzlos :(

Sie konnte schreiben:

const char Space = ' '; 

dann

new string(Space, numberOfSpaces) 

verwenden, aber ich weiß nicht sehen Sie irgendeinen Vorteil davon über

new string(' ', numberOfSpaces) 
1

Ich denke, Sie nehmen OO Weg zu weit .. Eine einfache Addition eines Raumes braucht nicht eine ganze Klasse.

tabs += new String(' '); 

oder

tabs += " "; 

ist gut so.

2

Der "OO" Weg wäre, einen einfacheren Weg zu finden, Ihr größeres Geschäftsproblem zu lösen. Zum Beispiel schlägt die Tatsache, dass Sie eine Variable mit dem Namen tabs haben, vor, dass Sie versuchen, Ihren eigenen Spaltenausrichtungscode zu rollen. String.Format unterstützt dies direkt, z.B.

// Left-align name and status, right-align amount (formatted as currency). 
writer.WriteLine("Name     Status   Amount"); 
writer.WriteLine("-------------------- ---------- ----------"); 
foreach(var item in items) { 
    writer.WriteLine(string.Format("{0,-20} {1,-10} {2,10:C}", item.Name, item.Status, item.Amount)); 
} 
+0

Danke Christian. Das größere Problem, das ich löse, ist, dass ich ein IEnumerable von Objekten mit einer Id und ParentId habe. Ich gebe den Inhalt dieser Objekte für den Datenexport in das CSV-Format aus und muss die Beziehung zwischen den Objekten anzeigen. Auf dem Bildschirm werden sie als Baumraster angezeigt und für den Export spacer ich sie, um die Beziehung zu zeigen. –

0

Sie könnten "\t" verwenden, glaube ich, Ihnen ein Tab-Zeichen zu geben. Das könnte den Raum klarer machen.

0

Mit StringBuilder.Insert und StringBuilder.Append können Sie beliebige Nummernbereiche erstellen, z. sb.Insert (0, "", 20) fügt 20 Leerzeichen an den Anfang Ihres sb (StringBuilder) -Objekts ein.

Verwandte Themen