Estoy tratando de insertar un cierto número de hendiduras antes de una cadena basada en la profundidad de un elemento y me pregunto si hay una manera de devolver una cadena repetida X veces. Ejemplo:
string indent = "---";
Console.WriteLine(indent.Repeat(0)); //would print nothing.
Console.WriteLine(indent.Repeat(1)); //would print "---".
Console.WriteLine(indent.Repeat(2)); //would print "------".
Console.WriteLine(indent.Repeat(3)); //would print "---------".
String
clase sobrecargado no está tomando una cadena como parámetro para crear repeticiones, lo que podría haber hecho que la respuesta aceptada encajara perfectamente.Respuestas:
Si solo tiene la intención de repetir el mismo carácter, puede usar el constructor de cadenas que acepta un carácter y la cantidad de veces que lo repite
new String(char c, int count)
.Por ejemplo, para repetir un guión cinco veces:
fuente
Si usa .NET 4.0, puede usarlo
string.Concat
junto conEnumerable.Repeat
.De lo contrario, iría con algo como la respuesta de Adam .
La razón por la que generalmente no recomendaría usar la respuesta de Andrey es simplemente que la
ToArray()
llamada introduce una sobrecarga superflua que se evita con elStringBuilder
enfoque sugerido por Adam. Dicho esto, al menos funciona sin requerir .NET 4.0; y es rápido y fácil (y no te va a matar si la eficiencia no es una gran preocupación).fuente
Console.WriteLine(string.Concat("-", string.Concat(Enumerable.Repeat(indent, N))));
fuente
input.Length * count
alStringBuilder
constructor, ¿no te parece?input.Length * count
alStringBuilder
constructor, puede omitir elStringBuilder
conjunto y crear un carácter [] del tamaño correcto de inmediato.StringBuilder
, y el código sería menos transparente.solución más eficaz para cadena
fuente
Para muchos escenarios, esta es probablemente la mejor solución:
El uso es entonces:
Esto se basa en otras respuestas (particularmente @ c0rd's). Además de la simplicidad, tiene las siguientes características, que no todas las otras técnicas discutidas comparten:
StringBuilder
la preasignación a través del almacenamiento.fuente
Use String.PadLeft , si su cadena deseada contiene solo un carácter.
Crédito adeudado aquí
fuente
string
constructor que toma unachar
y unint
?String.PadLeft
argumentos se invierten. Elcount
viene antes del carácter de relleno.Puede repetir su cadena (en caso de que no sea un solo carácter) y concat el resultado, de esta manera:
fuente
Buscaría la respuesta de Dan Tao, pero si no estás usando .NET 4.0 puedes hacer algo así:
fuente
fuente
Me gusta la respuesta dada. Sin embargo, a lo largo de las líneas de sames es lo que he usado en el pasado:
"". PadLeft (3 * Sangría, '-')
Esto cumplirá creando una sangría, pero técnicamente la pregunta era repetir una cadena. Si la sangría de la cadena es algo así como> - <entonces esto, así como la respuesta aceptada, no funcionaría. En este caso, la solución de c0rd usando stringbuilder se ve bien, aunque la sobrecarga de stringbuilder puede no ser la más eficiente. Una opción es construir una matriz de cadenas, llenarla con cadenas de sangría y luego concatenarla. A whit:
Todos amamos una solución inteligente, pero a veces lo mejor es simple
fuente
Agregar el método de extensión que estoy usando en todos mis proyectos:
Espero que alguien pueda usarlo ...
fuente
Sorprendido, nadie fue a la vieja escuela. No estoy haciendo ninguna afirmación sobre este código, pero solo por diversión:
fuente
No estoy seguro de cómo funcionaría esto, pero es un código fácil. (Probablemente lo he hecho parecer más complicado de lo que es).
Alternativamente, si conoce la cantidad máxima de niveles que puede esperar, puede declarar una matriz e indexarla. Probablemente quiera hacer esta matriz estática o constante.
fuente
No tengo suficiente representante para comentar la respuesta de Adam, pero la mejor manera de hacerlo es así:
Debe verificar si numTimes es mayor que cero, de lo contrario obtendrá una excepción.
fuente
No vi esta solución. Me resulta más simple para el lugar donde estoy actualmente en el desarrollo de software:
fuente
Para uso general, las soluciones que involucran la clase StringBuilder son las mejores para repetir cadenas de caracteres múltiples. Está optimizado para manejar la combinación de grandes cantidades de cadenas de una manera que la concatenación simple no puede y eso sería difícil o imposible de hacer de manera más eficiente a mano. Las soluciones de StringBuilder que se muestran aquí usan iteraciones O (N) para completar, una tarifa plana proporcional al número de veces que se repite.
Sin embargo, para un gran número de repeticiones, o donde se deben extraer altos niveles de eficiencia, un mejor enfoque es hacer algo similar a la funcionalidad básica de StringBuilder pero producir copias adicionales desde el destino, en lugar de desde la cadena original, como a continuación.
Esto duplica la longitud de la cadena de origen / destino con cada iteración, lo que ahorra la sobrecarga de restablecer contadores cada vez que atraviesa la cadena original, en lugar de leer y copiar sin problemas la cadena ahora mucho más larga, algo que los procesadores modernos pueden hacer mucho más eficientemente
Utiliza un logaritmo de base 2 para encontrar cuántas veces necesita duplicar la longitud de la cadena y luego lo hace tantas veces. Dado que el resto a copiar ahora es menor que la longitud total desde la que está copiando, puede simplemente copiar un subconjunto de lo que ya ha generado.
He usado el método Array.Copy () sobre el uso de StringBuilder, ya que una copia del contenido del StringBuilder en sí mismo tendría la sobrecarga de producir una nueva cadena con ese contenido con cada iteración. Array.Copy () evita esto, mientras sigue funcionando con una tasa de eficiencia extremadamente alta.
Esta solución toma O (1 + log N) iteraciones para completar, una tasa que aumenta logarítmicamente con el número de repeticiones (duplicar el número de repeticiones es igual a una iteración adicional), un ahorro sustancial sobre los otros métodos, que aumentan proporcionalmente.
fuente
Otro enfoque es considerar
string
comoIEnumerable<char>
y tienen un método de extensión genérica que multiplicará los elementos de una colección por el factor especificado.Entonces en tu caso:
fuente
Imprime una línea con repetición.
fuente
¡Puedes crear un ExtensionMethod para hacer eso!
O usando la solución @Dan Tao:
fuente