有一个简单的方法来返回一个string重复X次?
我想在一个string基于项目深度插入一定数量的缩进,我想知道是否有办法返回一个string重复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 "---------".
如果你只打算重复相同的字符,你可以使用string构造函数接受一个字符和次数来重复new String(char c, int count)
。
例如,重复一次短划线五次:
string result = new String('-', 5); // -----
如果您使用.NET 4.0,则可以将Enumerable.Repeat
与string.Concat
一起使用。
int N = 5; // or whatever Console.WriteLine(string.Concat(Enumerable.Repeat(indent, N)));
否则,我会像亚当的回答一样 。
我通常不会build议使用Andrey的答案的原因很简单,就是ToArray()
调用引入了多余的开销,而这种开销是由Adam提出的StringBuilder
方法所避免的。 也就是说,至less它不需要.NET 4.0; 而且它快速简单(如果效率不是太大的话,也不会杀了你)。
public static class StringExtensions { public static string Repeat(this string input, int count) { if (!string.IsNullOrEmpty(input)) { StringBuilder builder = new StringBuilder(input.Length * count); for(int i = 0; i < count; i++) builder.Append(input); return builder.ToString(); } return string.Empty; } }
使用String.PadLeft ,如果你想要的string只包含一个字符。
public static string Indent(int count, char pad) { return String.Empty.PadLeft(count, pad); }
这里到期的信用
性能最高的解决scheme
string result = new StringBuilder().Insert(0, "---", 5).ToString();
我会去Dan Tao的回答,但是如果你不使用.NET 4.0,你可以这样做:
public static string Repeat(this string str, int count) { return Enumerable.Repeat(str, count) .Aggregate( new StringBuilder(), (sb, s) => sb.Append(s)) .ToString(); }
string indent = "---"; string n = string.Concat(Enumerable.Repeat(indent, 1).ToArray()); string n = string.Concat(Enumerable.Repeat(indent, 2).ToArray()); string n = string.Concat(Enumerable.Repeat(indent, 3).ToArray());
我喜欢给出的答案。 沿着同样的路线,虽然是我以前用过的:
“” .PadLeft(3 *缩进, ' – ')
这将实现创build缩进,但技术上问题是重复一个string。 如果string缩进类似于> – <那么这以及接受的答案将无法正常工作。 在这种情况下,使用stringbuilder的c0rd的解决scheme看起来不错,尽pipestringbuilder的开销可能实际上并没有使它成为最高性能。 一个select是build立一个string数组,填充缩进string,然后concat。 白衣:
int Indent = 2; string[] sarray = new string[6]; //assuming max of 6 levels of indent, 0 based for (int iter = 0; iter < 6; iter++) { //using c0rd's stringbuilder concept, insert ABC as the indent characters to demonstrate any string can be used sarray[iter] = new StringBuilder().Insert(0, "ABC", iter).ToString(); } Console.WriteLine(sarray[Indent] +"blah"); //now pretend to output some indented line
我们都喜欢聪明的解决scheme,但有时候简单是最好的。
惊讶的人没有去老派。 我没有对这个代码做任何声明,只是为了好玩:
public static string Repeat(this string @this, int count) { var dest = new char[@this.Length * count]; for (int i = 0; i < dest.Length; i += 1) { dest[i] = @this[i % @this.Length]; } return new string(dest); }
不知道这将如何执行,但它是一个简单的代码段。 (我可能让它看起来比现在更复杂。)
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;
我没有足够的代表评论亚当的答案,但最好的办法来做到这一点是这样的:
public static string RepeatString(string content, int numTimes) { if(!string.IsNullOrEmpty(content) && numTimes > 0) { StringBuilder builder = new StringBuilder(content.Length * numTimes); for(int i = 0; i < numTimes; i++) builder.Append(content); return builder.ToString(); } return string.Empty; }
你必须检查numTimes是否大于零,否则你会得到一个exception。
另一种方法是将string
视为IEnumerable<char>
并有一个通用的扩展方法,它将集合中的项目乘以指定的因子。
public static IEnumerable<T> Repeat<T>(this IEnumerable<T> source, int times) { source = source.ToArray(); return Enumerable.Range(0, times).SelectMany(_ => source); }
所以在你的情况下:
string indent = "---"; var f = string.Concat(indent.Repeat(0)); //.NET 4 required //or var g = new string(indent.Repeat(5).ToArray());
你可以创build一个ExtensionMethod来做到这一点!
public static class StringExtension { public static string Repeat(this string str, int count) { string ret = ""; for (var x = 0; x < count; x++) { ret += str; } return ret; } }
还是用@丹涛解决scheme:
public static class StringExtension { public static string Repeat(this string str, int count) { if (count == 0) return ""; return string.Concat(Enumerable.Repeat(indent, N)) } }