我试图在基于项深度的字符串之前插入一定数量的缩进,我想知道是否有一种方法可以返回一个重复X次的字符串。例子:
string indent = "---";
Console.WriteLine(indent.Repeat(0)); //would print nothing.
Console.WriteLine(indent.Repeat(1)); //would print "---".
Console.WriteLine(indent.Repeat(2)); //would print "------".
Console.WriteLine(indent.Repeat(3)); //would print "---------".
对于许多场景,这可能是最简洁的解决方案:
public static class StringExtensions
{
public static string Repeat(this string s, int n)
=> new StringBuilder(s.Length * n).Insert(0, s, n).ToString();
}
用法是:
text = "Hello World! ".Repeat(5);
这建立在其他答案的基础上(特别是@c0rd)。除了简单之外,它还具有以下特性,不是所有讨论的其他技术都具有这些特性:
重复任意长度的字符串,而不仅仅是字符(根据OP的要求)。
通过存储预分配有效使用StringBuilder。
不知道这将如何执行,但这是一段简单的代码。(我可能让它看起来比实际更复杂。)
int indentCount = 3;
string indent = "---";
string stringToBeIndented = "Blah";
// Need dummy char NOT in stringToBeIndented - vertical tab, anyone?
char dummy = '\v';
stringToBeIndented.PadLeft(stringToBeIndented.Length + indentCount, dummy).Replace(dummy.ToString(), indent);
或者,如果您知道期望的最大层数,则可以声明一个数组并在其中建立索引。你可能想让这个数组是静态的或者是常量。
string[] indents = new string[4] { "", indent, indent.Replace("-", "--"), indent.Replace("-", "---"), indent.Replace("-", "----") };
output = indents[indentCount] + stringToBeIndented;
使用新字符串。创建函数时,我们可以预先分配合适的大小,并使用Span<char>在循环中复制单个字符串。
我怀疑这可能是最快的方法,因为根本没有额外的分配:字符串被精确分配。
public static string Repeat(this string source, int times)
{
return string.Create(source.Length * times, source, RepeatFromString);
}
private static void RepeatFromString(Span<char> result, string source)
{
ReadOnlySpan<char> sourceSpan = source.AsSpan();
for (var i = 0; i < result.Length; i += sourceSpan.Length)
sourceSpan.CopyTo(result.Slice(i, sourceSpan.Length));
}
dotnetfiddle
字符串和字符[版本1]
string.Join("", Enumerable.Repeat("text" , 2 ));
//result: texttext
字符串和字符[版本2]:
String.Concat(Enumerable.Repeat("text", 2));
//result: texttext
字符串和字符[版本3]
new StringBuilder().Insert(0, "text", 2).ToString();
//result: texttext
识字课只有:
'5' * 3;
//result: 555
识字课只有:
new string('5', 3);
//result: 555
扩展方法:
(工作更快-更好的WEB)
public static class RepeatExtensions
{
public static string Repeat(this string str, int times)
{
var a = new StringBuilder();
//Append is faster than Insert
( () => a.Append(str) ).RepeatAction(times) ;
return a.ToString();
}
public static void RepeatAction(this Action action, int count)
{
for (int i = 0; i < count; i++)
{
action();
}
}
}
用法:
var a = "Hello".Repeat(3);
//result: HelloHelloHello