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

当前回答

对我来说很好:

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

其他回答

使用字符串。Concat和Enumerable。重复这样做会更便宜 而不是使用String。加入

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

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

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

最好的版本当然是使用内置的方式:

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

在其他解决方案中,选择最简单的;只有当这被证明太慢的时候,努力寻找一个更有效的解决方案。

如果您使用StringBuilder并提前知道其结果长度,那么还可以使用适当的构造函数,这将更加高效,因为这意味着只进行一次耗时的分配,并且没有不必要的数据复制。 废话:当然上面的代码更有效。

虽然与之前的建议非常相似,但我喜欢保持简单,并应用以下内容:

string MyFancyString = "*";
int strLength = 50;
System.Console.WriteLine(MyFancyString.PadRight(strLength, "*");

标准的。net,

对我来说很好:

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