¿Cuál es la mejor manera de generar una cadena de \t
's en C #?
Estoy aprendiendo C # y experimentando con diferentes formas 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 implementación Tabs(uint numTabs)
es la mejor?
Por supuesto, eso depende de lo que significa "mejor".
La versión LINQ tiene solo dos líneas, lo cual es bueno. Pero, ¿las llamadas a repetir y agregar consumen innecesariamente tiempo / recursos?
La
StringBuilder
versión es muy clara, pero ¿laStringBuilder
clase es más lenta?La
string
versión es básica, lo que significa que es fácil de entender.¿No importa en absoluto? ¿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;
}
Devoluciones
Y
Devoluciones
desde...
¿Hay una función incorporada para repetir string o char en .net?
fuente
StruingBuilder
!string.Join
fue más rápido en el ejemplo porque estaban usando un delimitador de espacio.string.Concat
es apropiado cuando no hay delimitador.En todas las versiones de .NET, puede repetir una cadena así:
Para repetir un personaje,
new String('\t', count)
es tu mejor apuesta. Vea la respuesta de @CMS .fuente
La mejor versión es ciertamente usar la forma integrada:
De las otras soluciones, prefiera la más fácil; solo si esto resulta demasiado lento, busque una solución más eficiente.
Si usa unTonterías: por supuesto, el código anterior es más eficiente.StringBuilder
y conoce de antemano su longitud resultante, entonces también use un constructor apropiado, esto es mucho más eficiente porque significa que solo se realiza una asignación que consume mucho tiempo y no se copian datos innecesariamente.fuente
new string('\t', len)
ser entre 2x y 7x más rápidos que elStringBuilder
enfoque. ¿Por qué crees queStringBuilder
es más eficiente en este caso?Métodos de extensión:
fuente
Enumerable.Range(0, n).SelectMany(x => s)
Puede ser reemplazado por un simpleEnumerable.Repeat(s, n)
.SelectMany
voluntad para cada ficticio individualx
da una secuencia dechar
valores (desde losstring s
implementosIEnumerable<char>
), y todas esaschar
secuencias se concatenan en unachar
secuencia larga . Lo que sugieras en cambio dará unIEnumerable<string>
. No es lo mismo.Enumerable.Repeat
, lo habría hecho para concatenar las cadenas juntas:string.Concat(Enumerable.Repeat(s, n))
. Esto ya ha sido publicado antes .¿Qué pasa con el uso del método de extensión?
Entonces podrías escribir:
Tenga en cuenta que una prueba de rendimiento del uso de la versión del generador de cadenas para caracteres simples en lugar de cadenas le proporciona una gran penalidad de rendimiento: en mi computadora, la diferencia en el rendimiento medido es 1:20 entre: Debug.WriteLine ('-'. Repeat (1000000)) // versión de char y
Debug.WriteLine ("-". Repeat (1000000)) // versión de cadena
fuente
StringBuilder.Insert(Int32, String, Int32)
, como respondió Binoj Anthony .Qué tal esto:
fuente
new string('\t', 10)
la mejor soluciónSé 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:
Devoluciones
Para repetir una cadena como una matriz:
Devoluciones
Mantenlo simple.
fuente
Digamos que desea repetir '\ t' n número de veces, puede usar;
fuente
Su primer ejemplo que usa
Enumerable.Repeat
:se puede reescribir de manera más compacta con
String.Concat
:fuente
Usar
String.Concat
yEnumerable.Repeat
que será menos costoso que usarString.Join
fuente
fuente
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 cadena de sangría se determina de la siguiente manera:
fuente
Y otro método más
fuente
StringBuilder
constructor ahorra reasignación. Aún así, esto es más hablador y menos eficiente que usar elstring
constructor que puede repetir un carácter dado, como ya se muestra en la respuesta aceptada.Para mi esta bien:
fuente
Puedes crear un método de extensión
Entonces puedes usarlo así
fuente
Sin duda, la respuesta aceptada es la mejor y más rápida forma de repetir un solo personaje.
La respuesta de Binoj Anthony es una forma simple y bastante eficiente de repetir una cadena.
Sin embargo, si no le importa un poco más de código, puede usar mi técnica de relleno de matriz para crear estas cadenas de manera eficiente aún más rápido. En mis pruebas de comparación, el siguiente código se ejecutó en aproximadamente el 35% del tiempo del código StringBuilder.Insert.
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
fuente
Prueba esto:
fuente
Aunque es muy similar a una sugerencia anterior, me gusta mantenerlo simple y aplicar lo siguiente:
Estándar .Net realmente,
fuente