在C#中重复一个字符的最佳方法
什么是在C#中生成\t
string的最好方法
我正在学习C#并尝试用不同的方式来expression同样的事情。
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; }
那这个呢:
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.Concat
和Enumerable.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());