在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; 
}

当前回答

答案取决于你想要的复杂度。例如,我想用竖条勾勒出我所有的缩进,所以我的缩进字符串是这样确定的:

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

其他回答

使用扩展方法怎么样?


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版本来处理简单字符而不是字符串的性能测试会给你带来很大的性能损失: 在我的电脑上,测量的性能差异是1:20: Debug.WriteLine('-'.Repeat(1000000)) //char版本 Debug.WriteLine("-".Repeat(1000000)) //字符串版本

那么这个呢:

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

其中n是你想要重复字符串的次数。

或更好:

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

第一个使用Enumerable的例子。重复一遍:

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

可以用String更紧凑地重写。合并多个数组:

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

返回

“阿巴”

And

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

返回

“啊”

从…

.net中是否有重复字符串或char的内置函数?