" " 的替代方法,用于创建包含多个空白字符的字符串

Posted

技术标签:

【中文标题】" " 的替代方法,用于创建包含多个空白字符的字符串【英文标题】:Alternatives to " " for creating strings containing multiple whitespace characters 【发布时间】:2010-12-15 12:46:21 【问题描述】:

我想知道在 C# 中是否有更面向对象的方式来创建空间。

字面空间代码!

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

我可以使用什么来创建不是" " 的空间?

【问题讨论】:

"" 也没有问题,string.Empty 也没有问题。 我不认为有任何“错误”。我只是想知道是否有另一种方法可以做到这一点,也许更多......OO......我敢说。 使用 " " 或命名常量本身并没有 OO 或非 OO。 @乔。事实上,由于实习,源代码中的所有“”实例都将指向同一个字符串。至少根据小马托尼的说法。 yoda.arachsys.com/csharp/strings.html 我希望它被内置到 .net 框架中 string.Space(); string.Space(int repeat); 【参考方案1】:

你可以写

" "

而不是

new String(' ')

这有帮助吗?


根据您的工作,您可能需要查看接受字符和“重复”计数的 StringBuilder.Append 重载:

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

或者进入stringconstructor,它从一个“重复”计数的字符构造一个字符串:

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

这是一个满足您所有空间生成需求的企业 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';
        
    

【讨论】:

在我的实际代码中我正在做 new String(' ',numberOfSpaces) 所以我可能还需要使用新的 String 部分。 @Jamie:首先这样说会很有用,因为它基本上使所有现有答案都无效。 是的,对此表示歉意。我认为其他人在某些时候可能会有这个问题,而那些人可能没有指定空格的数量,所以我认为这些答案对他们很有用。 谢谢 dtb。我不得不接受这个,不仅因为您回答了顶部的问题,还因为您使用了“SpaceFactory”和“enterprisey”这些术语。 @dtb 我更改了标题,因为今晚有一个几乎相同的问题,但我试图保留对 SpaceCode 的原始引用,以保留这个非常有趣的答案的上下文。引用你的头像,“哦,不!”【参考方案2】:

现在您已经在 cmets 中进行了澄清:

在我的实际代码中,我正在做新的 String(' ',numberOfSpaces) 所以我 可能还需要使用新的 字符串部分。

...到目前为止,其他答案实际上是无用的:(

可以写:

const char Space = ' ';

然后使用

new string(Space, numberOfSpaces)

但我认为这样做没有任何好处

new string(' ', numberOfSpaces)

【讨论】:

【参考方案3】:

如果空格数会发生变化,那么您可以执行以下操作:

public static string Space(int count)

    return "".PadLeft(count);


Space(2);

【讨论】:

很好,但我会使用 String.Empty 来满足他对代码中字符串的厌恶! 或者使用带字符计数的字符串构造函数:return new string(' ', count);【参考方案4】:

没有理由这样做。在其他条件相同的情况下,smaller code is better code。 String.Emptynew String(' ')""" " 传达相同的信息,它们只是需要更多的字符。

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

【讨论】:

【参考方案5】:

根据这在您的代码中的流行程度,StringBuilder 方式可能会更好。

StringBuilder tabs = new StringBuilder();
...

tabs.Append(" ");

你也可以混入常量...

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

tabs.Append(SPACE);

【讨论】:

【参考方案6】:

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

public static string AddSpace(this String text, int size)

   return text + new string(' ', size)

但它本身就很糟糕。

【讨论】:

+1 - 扩展方法似乎与此处的 OP 风格一致。请注意,您可以用 return new String(' ', count); 替换此函数的主体,因为此重载的构造函数与您所做的完全一样:) 即使可能需要扩展方法,也没有必要像这样使用重复的字符串连接。 “返回文本+新字符串('',大小)”会更合适IMO。 (将第一个参数从关键字string 更改为text...) 谢谢约翰和乔恩(对不起托尼)。是的,感觉好多了,作为一个网络主体,我很少希望有两个相邻的空间,只是想我会加两便士的价值。【参考方案7】:

更“面向对象”的方法是找到一种更简单的方法来解决更大的业务问题。例如,您有一个名为 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));

【讨论】:

谢谢克里斯蒂安。我要解决的更大的问题是我有一个 IEnumerable 对象,其中包含 Id 和 ParentId。我正在将这些对象的内容输出为 CSV 格式以进行数据导出,并且需要显示对象之间的关系。在屏幕上,它们显示为树形网格,为了导出,我将它们隔开以显示关系。【参考方案8】:

如果语言允许,您可以将扩展属性添加到类型为 Space 的 String 中,例如:

public static class StringExt

    public static char Space(this String s)
    
        get 
            return ' ';
        
    

但这是不可能的。我认为如果它是可本地化的东西,最好将空间保留在属性内,但我认为空间在所有语言中都是通用的。

【讨论】:

【参考方案9】:

我认为您将 OO 走得太远了.. 一个简单的空格添加不需要整个类。

tabs += new String(' ');

tabs += " ";

没问题。

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

您可以创建类扩展。

public static class StringExtensions
    
        public static string GetSpace(this String)
        
           return " ";
        
    

你可以调用它。

String.GetSPace();

【讨论】:

以上是关于" " 的替代方法,用于创建包含多个空白字符的字符串的主要内容,如果未能解决你的问题,请参考以下文章

查找和替换替代方法?而不是 "REPLACE",只是简单地添加文本到现有的单元格中?

机器人框架 - Selenium2Library 的“输入文本”的任何替代方法用于将文本输入文本字段?

org.mybatis.spring.sqlsessionfactorybean在哪个包

scope="session"怎么访问javabean的方法

在 hql 脚本中,我们使用 "!sh echo ---new line---" 来表示相同的 .想知道在 impala 中打印 impala 脚本中任何行的替代方法吗?

Classnotfound "com.mysql.jdbc.Driver" 用于使用 netbeans/XAMPP 的 JDBC 驱动程序