什么是在C#中生成 \t
字符串的最佳方法
我正在学习C#并尝试不同的方式来说同样的事情 .
Tabs(uint t)
是一个返回 string
且 t
\t
的函数
例如 Tabs(3)
返回 "\t\t\t"
实现 Tabs(uint numTabs)
的这三种方式中哪一种最好?
当然,这取决于“最佳”的含义 .
-
LINQ版只有两行,很不错 . 但重复和聚合的调用是否会不必要地耗费时间/资源?
-
StringBuilder
版本非常清楚,但是StringBuilder
类的速度有点慢吗? -
string
版本是基本的,这意味着它很容易理解 . -
这根本不重要吗?它们都是平等的吗?
这些都是帮助我更好地了解C#的问题 .
private string Tabs(uint numTabs)
{
IEnumerable<string> tabs = Enumerable.Repeat("\t", (int) numTabs);
return (numTabs > 0) ? tabs.Aggregate((sum, next) => sum + next) : "";
}
private string Tabs(uint numTabs)
{
StringBuilder sb = new StringBuilder();
for (uint i = 0; i < numTabs; i++)
sb.Append("\t");
return sb.ToString();
}
private string Tabs(uint numTabs)
{
string output = "";
for (uint i = 0; i < numTabs; i++)
{
output += '\t';
}
return output;
}
19 回答
我知道这个问题已经有五年了,但有一种简单的方法可以重复一个甚至可以在.Net 2.0中运行的字符串 .
要重复一个字符串:
返回
要将字符串重复为数组:
返回
把事情简单化 .
您可以创建扩展方法
然后你可以像这样使用它
那这个呢:
其中
n
是您想要重复字符串的次数 .或更好:
扩展方法:
最好的版本肯定是使用内置方式:
在其他解决方案中,更喜欢最简单;只有当这证明太慢时,才能争取更有效的解决方案 .
如果你使用StringBuilder并提前知道它的结果长度,那么也使用适当的构造函数,这样更有效,因为它意味着只进行一次耗时的分配,并且没有不必要的数据复制 . 废话:当然上面的代码更有效率 .
这个怎么样:
而另一种方法
返回
和
返回
从...
Is there a built-in function to repeat string or char in .net?
虽然与之前的建议非常相似,但我希望保持简单并应用以下内容:
标准.Net真的,
答案实际上取决于您想要的复杂程度 . 例如,我想用竖线标记所有缩进,所以我的缩进字符串确定如下:
毫无疑问,接受的答案是重复单个角色的最佳和最快的方式 .
Binoj Anthony的回答是一种简单而有效的方法来重复一个字符串 .
但是,如果你不介意多一些代码,你可以使用我的数组填充技术来更快地有效地创建这些字符串 . 在我的比较测试中,下面的代码在StringBuilder.Insert代码的大约35%的时间内执行 .
有关此阵列填充技术的更多信息,请参阅Fastest way to fill an array with a single value
试试这个:
添加Microsoft.VisualBasic引用
使用:String result = Microsoft.VisualBasic.Strings.StrDup(5,"hi");
让我知道它是否适合您 .
对我来说很好:
在所有版本的.NET中,您可以重复一个字符串:
要重复一个角色,
new String('\t', count)
是你最好的选择 . 见the answer by @CMS .使用
String.Concat
和Enumerable.Repeat
比使用String.Join
便宜那么使用扩展方法呢?
然后你可以写:
请注意,对于简单字符而不是字符串使用stringbuilder版本的性能测试会给您一个主要的性能压力:在我的计算机上,测量性能的差异在1:20之间:Debug.WriteLine('-' .Repeat(1000000))// char版本和
Debug.WriteLine("-" .Repeat(1000000))//字符串版本
假设你要重复'\ t'次数,你可以使用;
你的第一个使用
Enumerable.Repeat
的例子:可以用
String.Concat
更紧凑地重写: