在C#中重复一个字符的最佳方法

什么是在C#中生成\tstring的最好方法

我正在学习C#并尝试用不同的方式来expression同样的事情。

Tabs(uint t)是一个函数,返回一个string t数量\t

例如, Tabs(3)返回"\t\t\t"

这三种实现Tabs(uint numTabs)方法中哪一种最好?

当然,这取决于“最好”的含义。

  1. LINQ版本只有两行,这很好。 但是呼叫重复和聚合不必要的时间/资源消耗?

  2. StringBuilder版本非常清楚,但StringBuilder类以某种方式更慢?

  3. string版本是基本的,这意味着它很容易理解。

  4. 这根本不重要吗? 他们都是平等的吗?

这些都是帮助我更好地感受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; } 

那这个呢:

 string tabs = new String('\t', n); 

其中n是您要重复string的次数。

或更好:

 static string Tabs(int n) { return new String('\t', n); } 

在.NET的所有版本中,您都可以重复一个string:

 public static string Repeat(string value, int count) { return new StringBuilder(value.Length * count).Insert(0, value, count).ToString(); } 

重复一个字符, new String('\t', count)是你最好的select。 查看@CMS的答案 。

 string.Concat(Enumerable.Repeat("ab", 2)); 

返回

“ABAB”

 string.Concat(Enumerable.Repeat("a", 2)); 

返回

“AA”

从…

有没有一个内置的函数重复string或字符在.NET中?

最好的版本肯定是使用内置的方式:

 string Tabs(int len) { return new string('\t', len); } 

其他的解决scheme,更喜欢最简单; 只有这样certificate太慢,才能争取更有效的解决办法。

如果你使用了一个StringBuilder并且事先知道了它的结果长度,那么也可以使用一个合适的构造函数,这样会更有效率,因为这意味着只需要一个耗时的分配,并且不需要复制数据。 胡说:当然上面的代码更有效率。

使用扩展方法怎么样?


 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(); } } 

然后你可以写:

 Debug.WriteLine('-'.Repeat(100)); // For Chars Debug.WriteLine("Hello".Repeat(100)); // For Strings 

请注意,使用stringbuilder版本进行简单字符而不是string的性能testing会给您一个主要的性能缺点:在我的计算机上,性能差异在1:20之间:Debug.WriteLine(' – '。Repeat(1000000)) // char版本和
Debug.WriteLine(“ – ”。Repeat(1000000))//string版本

扩展方法:

 public static string Repeat(this string s, int n) { return new String(Enumerable.Range(0, n).SelectMany(x => s).ToArray()); } public static string Repeat(this char c, int n) { return new String(c, n); } 

这个怎么样:

 //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)); 

我知道这个问题已经五年了,但是有一个简单的方法来重复一个string,甚至可以在.Net 2.0中工作。

重复一个string:

 string repeated = new String('+', 3).Replace("+", "Hello, "); 

返回

“你好你好你好, ”

重复一个string作为数组:

 // Two line version. string repeated = new String('+', 3).Replace("+", "Hello,"); string[] repeatedArray = repeated.Split(','); // One line version. string[] repeatedArray = new String('+', 3).Replace("+", "Hello,").Split(','); 

返回

{“你好你好你好”, ””}

把事情简单化。

使用String.ConcatEnumerable.Repeat比使用String.Join要便宜

 public static Repeat(this String pattern, int count) { return String.Concat(Enumerable.Repeat(pattern, count)); } 

假设你想重复'\ t'n次,你可以使用;

 String.Empty.PadRight(n,'\t') 

你的第一个使用Enumerable.Repeat例子:

 private string Tabs(uint numTabs) { IEnumerable<string> tabs = Enumerable.Repeat( "\t", (int) numTabs); return (numTabs > 0) ? tabs.Aggregate((sum, next) => sum + next) : ""; } 

可以用String.Concat更紧凑地重写:

 private string Tabs(uint numTabs) { return String.Concat(Enumerable.Repeat("\t", (int) numTabs)); } 
 var str = new string(Enumerable.Repeat('\t', numTabs).ToArray()); 

答案真的取决于你想要的复杂性。 例如,我想用垂直线来勾画所有的缩进,所以我的缩进string被确定如下:

 return new string(Enumerable.Range(0, indentSize*indent).Select( n => n%4 == 0 ? '|' : ' ').ToArray());