2009-11-11 1 views
20

Мне интересно, существует ли еще один способ создания пробелов на C#.Альтернативы "" для создания строк, содержащих несколько пробельных символов

Буквально космический код!

В настоящее время у меня есть tabs += new String(" ");, и я не могу не чувствовать, что это несколько напоминает использование "" вместо String.Empty.

Что я могу использовать для создания пробелов, которые не являются " "?

+3

Что не так с '' ''? –

+8

И нет ничего плохого в '' '', а не 'string.Empty'. – LukeH

+0

Я не думаю, что есть что-то «неправильное» как таковое. Мне просто интересно, есть ли другой способ сделать это, возможно, больше ... OO ... смею сказать. –

ответ

39

Вы можете написать

" " 

вместо

new String(' ') 

ли это помощь?


В зависимости от того, что вы делаете, вы можете посмотреть в StringBuilder.Append перегрузки, которая принимает характер и «повторить» подсчитывать:

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

или в stringconstructor, что строит строку из символ а 'повторять' подсчитывать:

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

Вот enterprisey решение OO, чтобы удовлетворить все ваши потребности в пространстве:

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

В моем фактическом коде я делаю новые строки ('', numberOfSpaces), поэтому мне, вероятно, еще нужно использовать новую часть String. –

+8

@ Jamie: Было бы полезно сказать, что для начала, поскольку это делает практически все существующие ответы недействительными. –

+0

Да, это извиняется за это. Я думаю, что другие люди могут задать этот вопрос в какой-то момент, и эти люди могут не указывать количество пробелов, поэтому я думаю, что эти ответы будут полезны для них. –

3

В зависимости от того, насколько распространено это в вашем коде, как StringBuilder может быть лучше.

StringBuilder tabs = new StringBuilder(); 
... 

tabs.Append(" "); 

Вы можете смешать в постоянной тоже ...

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

tabs.Append(SPACE); 
8

если количество пробелов будет меняться, то вы могли бы сделать что-то вроде этого:

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

Space(2); 
+1

Ничего, но я бы использовал String.Empty, чтобы удовлетворить его нелюбовь к строкам в коде! –

+2

Или используйте конструктор строк, который вместо символа символов: 'return new string ('', count);' – LukeH

2

удлиняет строку дать вам способ добавить место

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

Ужасно в своем собственном праве.

+1

+1 - методы расширения, похоже, соответствуют стилю OP. Обратите внимание, что вы можете заменить тело этой функции на 'return new String ('', count);' поскольку этот перегруженный конструктор делает именно то, что вы сделали :) –

+1

Несмотря на то, что может потребоваться метод расширения, нет необходимости использовать повторная конкатенация строк вроде этого. «return text + new string ('', size) будет более подходящим IMO. (Изменив первый параметр из ключевого слова 'string' в' text' ...) –

+0

Спасибо, Джон и Джон (извините, Тони). Да, это гораздо лучше, будучи веб-бодом, я редко хочу иметь два пространства рядом друг с другом, просто подумал, что добавлю свои два достоинства. –

5

Нет причин для этого. При прочих равных условиях, smaller code is better code. String.Empty и new String(' ') сообщают то же, что и "", и " ", они просто принимают больше символов, чтобы сделать это.

Попытка сделать его «более OO» просто добавляет персонажей без выгоды. Object-Orientation не является самоцелью.

1

Если язык разрешено для него можно добавить свойство расширения для типа String, которое было Space, что-то вроде:

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

, но это не представляется возможным. Я думаю, что было бы лучше сохранить пространство внутри объекта, если бы оно было локализуемым, но я думаю, что пространства универсальны во всех языках.

14

Теперь, когда вы разъяснены в комментариях:

В моем фактическом коде я делаю новый String (»», numberOfSpaces), так что я , вероятно, нужен еще использовать новую часть строки.

... другие ответы до сих пор эффективно бесполезен :(

Вы могли написать:

const char Space = ' '; 

затем использовать

new string(Space, numberOfSpaces) 

, но я не см. любую выгоду от этого более

new string(' ', numberOfSpaces) 
1

Я думаю, что вы делаете путь OO далеко. Простое добавление пространства не требует целого класса.

tabs += new String(' '); 

или

tabs += " "; 

просто отлично.

2

Чем больше «OO» будет искать более простой способ решения вашей более крупной бизнес-задачи. Например, тот факт, что у вас есть переменная с именем tabs, подсказывает мне, что вы пытаетесь свернуть свой собственный код выравнивания столбца. String.Format поддерживает это непосредственно, например.

// 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

Спасибо, христианин. Большая проблема, которую я решаю, заключается в том, что у меня есть IEnumerable объектов с Id и ParentId. Я выводя содержимое этих объектов в формат CSV для экспорта данных и должен показать связь между объектами. На экране они отображаются как сетка деревьев и для экспорта. Я откладываю их, чтобы показать взаимосвязь. –

0

Вы можете использовать "\t", я думаю, чтобы дать вам символ табуляции. Это может сделать пространство более понятным.

0

StringBuilder.Insert и StringBuilder.Append позволяют создавать любые пробелы, например. sb.Insert (0, "", 20) вставляет 20 пробелов в начало вашего объекта sb (StringBuilder).

Смежные вопросы