" " 的替代方法,用于创建包含多个空白字符的字符串
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);
或者进入string
constructor,它从一个“重复”计数的字符构造一个字符串:
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.Empty
和 new 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 驱动程序