2009-11-11 18 views
20

我想知道是否有更多的OO方式在C#中创建空格。用于创建包含多个空白字符的字符串的替代方法

字面空格代码!

我目前有tabs += new String(" ");,我不禁觉得这有点让人想起使用""而不是String.Empty

我能用什么来创建不是" "的空间?

+3

'''有什么问题? – 2009-11-11 16:14:26

+8

而且''''而不是'string.Empty'也没有错。 – LukeH 2009-11-11 16:17:32

+0

我不认为有这样的“错误”。我只是想知道是否有另一种方式来做到这一点,也许更多... OO ...我敢说。 – 2009-11-11 16:18:11

回答

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

在我的实际代码中,我正在做新的String(',numberOfSpaces),所以我可能还需要使用新的String部分。 – 2009-11-11 16:20:11

+8

@Jamie:说一开始就很有用,因为它基本上使所有现有答案都无效。 – 2009-11-11 16:22:50

+0

是的,为此的appologies。我认为其他人在某个时候可能会有这个问题,这些人可能没有指定空格的数量,所以我认为这些答案对他们很有用。 – 2009-11-11 16:33:56

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来满足他对代码中字符串的不喜欢! – 2009-11-11 16:27:46

+2

或者使用字符串构造函数来代替字符数:'返回新字符串('',count);' – LukeH 2009-11-11 16:29:37

2

扩展字符串给你一个添加空间的方法

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

虽然它自己的权利可怕。

+1

+1 - 扩展方法似乎与OP的样式一致。注意你可以用'return new String('',count);'替换这个函数的主体,因为这个重载的构造函数完全和你所做的一样:) – 2009-11-11 16:26:09

+1

即使可能需要扩展方法,也不需要使用像这样重复字符串连接。 “返回文本+新字符串('',大小)”将是更合适的国际海事组织。 (将关键字'string'的第一个参数更改为'text' ...) – 2009-11-11 16:29:18

+0

感谢John和Jon(抱歉Tony)。是的,感觉好多了,作为一个网络机构,我很少想要在彼此旁边有两个空格,只是认为我会增加我的两便士价值。 – 2009-11-11 16:34:04

5

没有理由这样做。其他所有条件相同,smaller code is better codeString.Emptynew String(' ')沟通与""" "相同的东西,他们只是采取更多的字符来做到这一点。

试图让它“更多OO”只是增加字符没有任何好处。面向对象本身并不是目的。

1

如果语言允许它,你可以扩展属性添加到类型为String这是空间,是这样的:

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

但这是不可能的。我认为如果这是一个可以本地化的东西,那么留在房屋内部的空间会更好,但我认为空间在所有语言中都是通用的。

14

现在你已经在注释中明确:

在我实际的代码我在做新的 字符串(””,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

谢谢基督徒。我正在解决的更大的问题是我有一个Idnumerable对象与Id和ParentId。我将这些对象的内容输出为CSV格式用于数据导出,并需要显示对象之间的关系。在屏幕上,它们显示为树状网格,为了导出,我将它们间隔以显示关系。 – 2009-11-11 16:47:16

0

我想你可以用"\t"给你一个制表符。这可能会使空间更清晰。

0

StringBuilder.Insert和StringBuilder.Append允许您创建任何数字空格,例如sb.Insert(0,“”,20)将在您的sb(StringBuilder)对象的开始处插入20个空格。

相关问题