在C#中重复字符的最佳方法是什么?

1022

在C#中生成一串\t的最佳方法是什么?

我正在学习C#,并尝试用不同的方式表达相同的意思。

Tabs(uint t)是一个返回带有t\tstring的函数。

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

这三种实现Tabs(uint numTabs)的方式哪种最好呢?

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

  1. LINQ版本只有两行,很好。 但是,对Repeat和Aggregate的调用是否不必要地消耗时间/资源?

  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;
}
21个回答

15

使用String.ConcatEnumerable.Repeat会比使用String.Join更经济。

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

你能量化一下吗?在特定的系统上。 - Peter Mortensen

8
var str = new string(Enumerable.Repeat('\t', numTabs).ToArray());

为什么要使用额外的可枚举项,当使用以下代码可以得到相同的结果:new string('\t', numTabs) - undefined

4
你可以创建一个扩展方法。
static class MyExtensions
{
    internal static string Repeat(this char c, int n)
    {
        return new string(c, n);
    }
}

那么您可以像这样使用它

Console.WriteLine('\t'.Repeat(10));

4

对我来说这很好:

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

以什么方式好? - Peter Mortensen
它应该做什么?在数字前面添加前导零吗?这怎么回答问题呢?问题是“在C#中生成一串\t的最佳方法是什么?”并提供了三种特定的方法。 - Peter Mortensen

4
另一种方法:

还有一种方法

new System.Text.StringBuilder().Append('\t', 100).ToString()

将生成的字符串长度传递给StringBuilder构造函数可以节省重新分配的开销。然而,这种方法比使用已经在被接受的答案中展示的可以重复给定字符的string构造函数更冗长且效率更低。 - Palec

4
答案实际上取决于您想要的复杂度。例如,我想用一条垂直线勾勒出所有缩进,因此我的缩进字符串确定如下:
return new string(Enumerable.Range(0, indentSize*indent).Select(
  n => n%4 == 0 ? '|' : ' ').ToArray());

1

毫无疑问,被接受的答案是重复单个字符的最佳和最快的方式。

Binoj Anthony的答案是重复字符串的简单而相当有效的方法。

然而,如果您不介意更多的代码,您可以使用我的数组填充技术来更高效地创建这些字符串。在我的比较测试中,下面的代码执行时间约为StringBuilder.Insert代码的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);
}

关于这种数组填充技术的更多信息,请参见用单个值填充数组的最快方法


0
string input = "abc"
string output = "";
for (int i = 0; i < input.Length; i++)
{
    output += input[i].ToString() + input[i].ToString();
}
Console.WriteLine(output);

输出:

=aabbcc

1
那怎么回答问题呢?问题是“在C#中生成一串\t的最佳方法是什么?”一个问题不仅仅是标题。还有关于三种具体的实现方法。 - Peter Mortensen

-1
虽然与之前的建议非常相似,但我喜欢保持简单并采用以下方法:
string MyFancyString = "*";
int strLength = 50;
System.Console.WriteLine(MyFancyString.PadRight(strLength, "*");

这是标准的.NET,真的。


1
它只会添加填充,不会重复。 - levi
@levi:填充有什么问题吗?string result = string.Empty.PadRight('\t',5)不会返回所需的结果吗(在这种情况下,是5个制表符)? - J.Lehmann
那怎么回答问题呢?问题是“在C#中生成一串\t的最佳方法是什么?”一个问题不仅仅是标题。还有关于三种具体的实现方法。 - Peter Mortensen

-1

尝试这个:

  1. 添加 Microsoft.VisualBasic 引用
  2. 使用:String result = Microsoft.VisualBasic.Strings.StrDup(5, "hi");

2
在大多数情况下,添加对另一个程序集的依赖并需要加载它是不合理的,尤其是当你需要这样的功能时。不过,了解.NET中有这样一种东西还是很好的。 - Palec
在不同的情境下,有很多利弊,因此每个人都应该根据自己所处的情况来做出决定。 - Toso Pankovski
那怎么回答问题呢?问题是:“C#中生成一串\t的最佳方法是什么?”一个问题不只是标题。还涉及到三种具体的做法。 - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接