c# - La mejor manera de repetir un personaje en C #


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


Answers



¿Qué tal esto?

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

Donde n es el número de veces que desea repetir la cadena.

O mejor:

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



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 la respuesta por @CMS .







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 importante de preformance: 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




Métodos de extensión:

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



Qué tal esto:

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



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.




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



Digamos que quiere repetir '\ t' n número de veces, puede usar;

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



Su primer ejemplo que usa Enumerable.Repeat :

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

se puede reescribir de forma más compacta con String.Concat :

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



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



La respuesta realmente depende de la complejidad que desee. Por ejemplo, quiero delinear todas mis sangrías con una barra vertical, por lo que mi sangría se determina de la siguiente manera:

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