Best way to repeat a character in C#
用C语言生成一个
我正在学习"C",并尝试用不同的方式表达相同的话。
例如,
这三种实现
当然,这取决于"最好"是什么意思。
LINQ版本只有两行,这很好。但是,是否需要重复和聚合不必要的时间/资源消耗?
这一点都不重要吗?他们都平等吗?
这些问题都是为了帮助我更好地感受C。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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; } |
这个怎么样:
1 |
其中,
或更好:
1 2 3 4 |
1 | string.Concat(Enumerable.Repeat("ab", 2)); |
退换商品
"abab"
和
1 | string.Concat(Enumerable.Repeat("a", 2)); |
退换商品
"aa"
从…
在.NET中是否有一个内置函数来重复字符串或字符?
在.NET的所有版本中,您都可以重复一个字符串,从而:
1 2 3 4 | public static string Repeat(string value, int count) { return new StringBuilder(value.Length * count).Insert(0, value, count).ToString(); } |
重复一个字符,你的最佳选择是
最好的版本当然是使用内置方式:
1 |
在其他解决方案中,最好是最简单的;只有当证明这太慢时,才努力寻求更有效的解决方案。
如果您提前使用胡说:当然上面的代码更有效。
扩展方法:
1 2 3 4 5 6 7 8 9 |
使用扩展方法怎么样?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public static class StringExtensions { public static string Repeat(this char chatToRepeat, int repeat) { return new string(chatToRepeat,repeat); } public static string Repeat(this string stringToRepeat,int repeat) { var builder = new StringBuilder(repeat*stringToRepeat.Length); for (int i = 0; i < repeat; i++) { builder.Append(stringToRepeat); } return builder.ToString(); } } |
然后你可以写:
1 2 | Debug.WriteLine('-'.Repeat(100)); // For Chars Debug.WriteLine("Hello".Repeat(100)); // For Strings |
请注意,对简单字符而不是字符串使用StringBuilder版本的性能测试会给您带来主要的性能惩罚:在我的计算机上,测量性能的差异为1:20,这两个值之间:debug.writeline('-'.repeat(1000000))//char版本和debug.writeline("-".repeat(1000000))//字符串版本
这个怎么样?
1 2 3 4 5 6 7 8 | //Repeats a character specified number of times public static string Repeat(char character,int numberOfIterations) { return"".PadLeft(numberOfIterations, character); } //Call the Repeat method Console.WriteLine(Repeat('\t',40)); |
我知道这个问题已经存在5年了,但是有一个简单的方法可以重复一个字符串,它甚至可以在.NET 2.0中工作。
要重复字符串:
1 |
退换商品
"Hello, Hello, Hello,"
要将字符串作为数组重复:
1 2 3 4 5 6 |
退换商品
{"Hello","Hello","Hello",""}
保持简单。
您使用
1 2 3 4 5 6 7 | private string Tabs(uint numTabs) { IEnumerable<string> tabs = Enumerable.Repeat( "\t", (int) numTabs); return (numTabs > 0) ? tabs.Aggregate((sum, next) => sum + next) :""; } |
可以用
1 2 3 4 | private string Tabs(uint numTabs) { return String.Concat(Enumerable.Repeat("\t", (int) numTabs)); } |
假设你想重复几次,你可以使用;
1 | String.Empty.PadRight(n,'\t') |
使用
1 2 3 4 | public static Repeat(this String pattern, int count) { return String.Concat(Enumerable.Repeat(pattern, count)); } |
1 |
答案真的取决于你想要的复杂性。例如,我想用竖线勾勒出所有缩进,因此缩进字符串的确定如下:
1 2 | return new string(Enumerable.Range(0, indentSize*indent).Select( n => n%4 == 0 ? '|' : ' ').ToArray()); |
可以创建扩展方法
1 2 3 4 5 6 7 | static class MyExtensions { internal static string Repeat(this char c, int n) { return new string(c, n); } } |
然后你可以这样使用它
1 | Console.WriteLine('\t'.Repeat(10)); |
还有另一种方法
1 |
对我来说很好:
1 2 3 4 5 6 7 8 9 10 11 | public static class Utils { public static string LeftZerosFormatter(int zeros, int val) { string valstr = val.ToString(); valstr = new string('0', zeros) + valstr; return valstr.Substring(valstr.Length - zeros, zeros); } } |
毫无疑问,公认的答案是重复单个字符的最佳和最快的方法。
BinojAnthony的答案是一个简单而有效的重复一个字符串的方法。
但是,如果您不介意再多编写一些代码,您可以使用我的数组填充技术更快地有效地创建这些字符串。在我的比较测试中,下面的代码在大约35%的StringBuilder时间内执行。插入代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | public static string Repeat(this string value, int count) { var values = new char[count * value.Length]; values.Fill(value.ToCharArray()); return new string(values); } public static void Fill<T>(this T[] destinationArray, params T[] value) { if (destinationArray == null) { throw new ArgumentNullException("destinationArray"); } if (value.Length > destinationArray.Length) { throw new ArgumentException("Length of value array must not be more than length of destination"); } // set the initial array value Array.Copy(value, destinationArray, value.Length); int copyLength, nextCopyLength; for (copyLength = value.Length; (nextCopyLength = copyLength << 1) < destinationArray.Length; copyLength = nextCopyLength) { Array.Copy(destinationArray, 0, destinationArray, copyLength, copyLength); } Array.Copy(destinationArray, 0, destinationArray, copyLength, destinationArray.Length - copyLength); } |
有关此数组填充技术的详细信息,请参阅用单个值填充数组的最快方法
试试这个:
尽管与之前的建议非常相似,但我喜欢保持简单并应用以下内容:
1 2 3 | string MyFancyString ="*"; int strLength = 50; System.Console.WriteLine(MyFancyString.PadRight(strLength,"*"); |
标准.NET真的,