[C#] La mejor manera de repetir un personaje en C #


Answers

En todas las versiones de .NET, puede repetir una cadena así:

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

Para repetir un personaje, una new String('\t', count) es tu mejor apuesta. Vea share .

Question

Cuál es la mejor forma de generar una cadena de \t 's en C #

Estoy aprendiendo C # y experimentando con diferentes maneras de decir lo mismo.

Tabs(uint t) es una función que devuelve una string con t cantidad de \t 's

Por ejemplo, Tabs(3) devuelve "\t\t\t"

¿Cuál de estas tres formas de implementar Tabs(uint numTabs) es la mejor?

Por supuesto, eso depende de lo que "mejor" significa.

  1. La versión LINQ es solo dos líneas, lo cual es bueno. Pero, ¿las llamadas a Repeat and Aggregate consumen innecesariamente tiempo / recursos?

  2. La versión de StringBuilder es muy clara, pero ¿es la clase StringBuilder algo más lenta?

  3. La versión de string es básica, lo que significa que es fácil de entender.

  4. ¿No importa para nada? ¿Son todos iguales?

Todas estas son preguntas para ayudarme a tener una mejor idea de 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; 
}



Y otro método más

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



Usar String.Concat y Enumerable.Repeat que será menos costoso que usar String.Join

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



Puedes crear un método de extensión

static class MyExtensions
{
    internal static string Repeat(this char c, int n)
    {
        return new string(c, n);
    }
}

Entonces puedes usarlo así

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



Sé que esta pregunta ya tiene cinco años, pero hay una manera simple de repetir una cadena que incluso funciona en .Net 2.0.

Para repetir una cadena:

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

Devoluciones

"Hola hola hola, "

Para repetir una cadena como una matriz:

// 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(',');

Devoluciones

{"Hola hola hola", ""}

Mantenlo simple.




La mejor versión es sin duda utilizar la forma integrada:

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

De las otras soluciones, prefiere la más fácil; solo si esto resulta demasiado lento, busque una solución más eficiente.

Si usa un StringBuilder y conoce su longitud resultante por adelantado, entonces también use un constructor apropiado, esto es mucho más eficiente porque significa que solo se lleva a cabo una asignación que consume mucho tiempo, y no hay copia innecesaria de datos. Tonterías: por supuesto, el código anterior es más eficiente.




¿Qué hay de usar el método de extensión?

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

Entonces podrías escribir:

Debug.WriteLine('-'.Repeat(100)); // For Chars  
Debug.WriteLine("Hello".Repeat(100)); // For Strings

Tenga en cuenta que una prueba de rendimiento de usar la versión de stringbuilder para caracteres simples en lugar de cadenas le da una penalidad de preforma importante: en mi computadora la diferencia en el rendimiento medido es 1:20 entre: Debug.WriteLine ('-'. Repeat (1000000)) // versión de char
Debug.WriteLine ("-". Repeat (1000000)) // versión de cadena




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