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




9 Answers

En todas las versiones de .NET, puedes 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, la new String('\t', count) es tu mejor apuesta. Vea share .

c# .net string

Cuál es la mejor manera 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 que depende de lo que significa "mejor".

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

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

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

  4. ¿No importa en absoluto? ¿Son todos iguales?

Estas son todas las preguntas que me ayudan 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; 
}



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

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

De las otras soluciones, preferimos las más fáciles; solo si esto resulta demasiado lento, procure una solución más eficiente.

Si usa un StringBuilder y conoce de antemano su longitud resultante, entonces también usa un constructor apropiado, esto es mucho más eficiente porque significa que solo se realiza una asignación que requiere mucho tiempo y no se realiza una copia innecesaria de datos. Tonterías: por supuesto que 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 del uso de la versión de stringbuilder para caracteres simples en lugar de cadenas le otorga una gran penalidad de rendimiento: en mi computadora la diferencia en el rendimiento medido es 1:20 entre: Debug.WriteLine ('-'. Repeat (1000000)) // versión char y
Debug.WriteLine ("-". Repeat (1000000)) // versión de cadena




Sé que esta pregunta ya tiene cinco años, pero hay una forma sencilla 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.




Tu primer ejemplo que utiliza 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());



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



Sin lugar a dudas, la respuesta aceptada es la mejor y más rápida manera de repetir un solo carácter.

La respuesta de Binoj Anthony es una manera simple y bastante eficiente de repetir una cuerda.

Sin embargo, si no le importa un poco más de código, puede usar mi técnica de relleno de matrices para crear eficientemente estas cadenas incluso más rápido. En mis pruebas de comparación, el siguiente código se ejecuta en aproximadamente el 35% del tiempo del código StringBuilder.Insert.

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

Para obtener más información sobre esta técnica de relleno de matriz, consulte la forma más rápida de llenar una matriz con un solo valor




Prueba esto:

  1. Añadir referencia de Microsoft.VisualBasic
  2. Use: String result = Microsoft.VisualBasic.Strings.StrDup (5, "hi");
  3. Déjame saber si te funciona.



Related


Tags

c#   .net   string