关于.NET:在C#中重复字符的最佳方法

Best way to repeat a character in C#

用C语言生成一个\t字符串的最佳方法是什么?#

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

Tabs(uint t)是返回stringt数量的\t的函数。

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

这三种实现Tabs(uint numTabs)的方法中,哪一种是最好的?

当然,这取决于"最好"是什么意思。

  • LINQ版本只有两行,这很好。但是,是否需要重复和聚合不必要的时间/资源消耗?

  • StringBuilder版本非常清晰,但StringBuilder类是否慢了一些?

  • string版本是基本的,这意味着它很容易理解。

  • 这一点都不重要吗?他们都平等吗?

  • 这些问题都是为了帮助我更好地感受C。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    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;
    }

    这个怎么样:

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

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

    或更好:

    1
    2
    3
    4
    static string Tabs(int n)
    {
        return new String('\t', n);
    }


    1
    string.Concat(Enumerable.Repeat("ab", 2));

    退换商品

    "abab"

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

    退换商品

    "aa"

    从…

    在.NET中是否有一个内置函数来重复字符串或字符?


    在.NET的所有版本中,您都可以重复一个字符串,从而:

    1
    2
    3
    4
    public static string Repeat(string value, int count)
    {
        return new StringBuilder(value.Length * count).Insert(0, value, count).ToString();
    }

    重复一个字符,你的最佳选择是new String('\t', count)。请参见@cms的答案。


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

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

    在其他解决方案中,最好是最简单的;只有当证明这太慢时,才努力寻求更有效的解决方案。

    如果您提前使用StringBuilder并知道其结果长度,那么也要使用适当的构造函数,这样效率更高,因为它意味着只有一个耗时的分配发生,并且没有不必要的数据复制。胡说:当然上面的代码更有效。


    扩展方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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);
    }


    使用扩展方法怎么样?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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();
       }
    }

    然后你可以写:

    1
    2
    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))//字符串版本


    这个怎么样?

    1
    2
    3
    4
    5
    6
    7
    8
    //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));


    我知道这个问题已经存在5年了,但是有一个简单的方法可以重复一个字符串,它甚至可以在.NET 2.0中工作。

    要重复字符串:

    1
    string repeated = new String('+', 3).Replace("+","Hello,");

    退换商品

    "Hello, Hello, Hello,"

    要将字符串作为数组重复:

    1
    2
    3
    4
    5
    6
    // 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(',');

    退换商品

    {"Hello","Hello","Hello",""}

    保持简单。


    您使用Enumerable.Repeat的第一个示例:

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

    可以用String.Concat更紧凑地重写:

    1
    2
    3
    4
    private string Tabs(uint numTabs)
    {      
        return String.Concat(Enumerable.Repeat("\t", (int) numTabs));
    }

    假设你想重复几次,你可以使用;

    1
    String.Empty.PadRight(n,'\t')


    使用String.ConcatEnumerable.Repeat,价格较低而不是使用String.Join

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


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

    答案真的取决于你想要的复杂性。例如,我想用竖线勾勒出所有缩进,因此缩进字符串的确定如下:

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

    可以创建扩展方法

    1
    2
    3
    4
    5
    6
    7
    static class MyExtensions
    {
        internal static string Repeat(this char c, int n)
        {
            return new string(c, n);
        }
    }

    然后你可以这样使用它

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

    还有另一种方法

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


    对我来说很好:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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);
        }
    }


    毫无疑问,公认的答案是重复单个字符的最佳和最快的方法。

    BinojAnthony的答案是一个简单而有效的重复一个字符串的方法。

    但是,如果您不介意再多编写一些代码,您可以使用我的数组填充技术更快地有效地创建这些字符串。在我的比较测试中,下面的代码在大约35%的StringBuilder时间内执行。插入代码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    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);
    }

    有关此数组填充技术的详细信息,请参阅用单个值填充数组的最快方法


    试试这个:

  • 添加Microsoft.VisualBasic引用
  • 用法:string result=microsoft.visualbasic.strings.strdup(5,"hi");
  • 让我知道它是否适合你。

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

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

    标准.NET真的,