355 votos

La mejor manera de repetir un personaje en C #

¿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 la misma cosa.

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

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

Cual de estas tres formas de implementar Tabs(uint numTabs) es el mejor?

Por supuesto que depende de lo "mejor" de los medios.

  1. El LINQ versión es de sólo dos líneas, lo cual es bueno. Pero son las llamadas a Repetir y Agregado innecesariamente el tiempo/recursos que consume?

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

  3. La string versión 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 ayuden a conseguir una mejor sensación para 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; 
}

757voto

CMS Puntos 315406

¿Qué pasa con esto:

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

O mejor:

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

40voto

Konrad Rudolph Puntos 231505

La mejor versión es sin duda el uso de la builtin manera:

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

De las otras soluciones, prefieren el más fácil; sólo si este está demostrando ser demasiado lento, luchar por una solución más eficiente.

Si utiliza un StringBuilder y saber su longitud resultante de antemano, entonces también el uso de un constructor apropiado, esto es mucho más eficiente, porque significa que sólo un tiempo de asignación se lleva a cabo, y no la copia innecesaria de datos. Tonterías: por supuesto que el código anterior es más eficiente.

38voto

Binoj Antony Puntos 7519

Bueno, en todas las versiones de Framework para repetir una cadena siempre se puede hacer esto

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

para caracteresCMS new String ('\ t', n) es su mejor apuesta.

34voto

Ronnie Puntos 1863

¿Qué pasa con 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();
   }
}
 

A continuación, podría escribir:

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

Tenga en cuenta que una prueba de rendimiento de la utilización de la versión StringBuilder para caracteres simples en lugar de cadenas le da una gran penalidad preformance: en mi ordenador la diferencia en el rendimiento medido a 1:20 entre: Debug.WriteLine (. '-' Repeat (1000000)) // versión carbón y
Debug.WriteLine ("-". Repetir (1000000)) // cadena de versión

20voto

Rodrick Chapman Puntos 2981

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: