在c#中生成一串\t的最好方法是什么
我正在学习c#,尝试用不同的方式说同一件事。
Tabs(uint t)是一个返回t个\t的字符串的函数
例如Tabs(3)返回"\t\t\t"
这三种实现Tabs(uint numTabs)的方法中哪一种是最好的?
当然,这取决于“最好”是什么意思。
LINQ版本只有两行,这很好。但是对Repeat和Aggregate的调用是否会不必要地消耗时间/资源?
StringBuilder版本非常清楚,但StringBuilder类是否更慢?
字符串版本是基本的,这意味着它很容易理解。
这一点关系都没有吗?他们都是平等的吗?
这些都是帮助我更好地理解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;
}
毫无疑问,公认的答案是重复单个字符的最佳和最快的方法。
Binoj Anthony的答案是一种简单而有效的重复字符串的方法。
但是,如果您不介意多写一些代码,您可以使用我的数组填充技术来高效地更快地创建这些字符串。在我的比较测试中,下面的代码只执行了StringBuilder 35%的时间。插入的代码。
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);
}
有关此数组填充技术的更多信息,请参见用单个值填充数组的最快方法