¿Hay una forma fácil de devolver una cadena repetida X veces?

Estoy tratando de insertar un cierto número de sangrías antes de una cadena en función de la profundidad de un ítem 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 "---------". 

Si solo tiene la intención de repetir el mismo carácter, puede usar el constructor de cadena que acepta un carácter y la cantidad de veces que lo repite. new String(char c, int count) .

Por ejemplo, repetir un tablero cinco veces:

 string result = new String('-', 5); // ----- 

Si usa .NET 4.0, puede usar string.Concat junto con Enumerable.Repeat .

 int N = 5; // or whatever Console.WriteLine(string.Concat(Enumerable.Repeat(indent, N))); 

De lo contrario, iría con algo así como la respuesta de Adam .

La razón por la que generalmente no aconsejaría usar la respuesta de Andrey es simplemente que la llamada ToArray() introduce una sobrecarga superflua que se evita con el enfoque StringBuilder 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).

 public static class StringExtensions { public static string Repeat(this string input, int count) { if (!string.IsNullOrEmpty(input)) { StringBuilder builder = new StringBuilder(input.Length * count); for(int i = 0; i < count; i++) builder.Append(input); return builder.ToString(); } return string.Empty; } } 

la solución más eficaz para la cadena

 string result = new StringBuilder().Insert(0, "---", 5).ToString(); 

Use String.PadLeft , si la cadena deseada contiene solo un carácter.

 public static string Indent(int count, char pad) { return String.Empty.PadLeft(count, pad); } 

Crédito debido aquí

Me gustaría ir a la respuesta de Dan Tao, pero si no estás usando .NET 4.0 puedes hacer algo como eso:

 public static string Repeat(this string str, int count) { return Enumerable.Repeat(str, count) .Aggregate( new StringBuilder(), (sb, s) => sb.Append(s)) .ToString(); } 

Esto se basa en otras respuestas (particularmente @ c0rd’s).

Para muchos escenarios, esta es probablemente la mejor solución:

 public static class StringExtensions { public static string Repeat(this string s, int n) => new StringBuilder(s.Length * n).Insert(0, s, n).ToString(); } 

El uso es entonces:

 text = "Hello World! ".Repeat(5); 
  string indent = "---"; string n = string.Concat(Enumerable.Repeat(indent, 1).ToArray()); string n = string.Concat(Enumerable.Repeat(indent, 2).ToArray()); string n = string.Concat(Enumerable.Repeat(indent, 3).ToArray()); 

Me gusta la respuesta dada. Sin embargo, a lo largo de las líneas sames es lo que he usado en el pasado:

“” .PadLeft (3 * Sangrado, ‘-‘)

Esto cumplirá con la creación de una sangría, pero técnicamente la pregunta era repetir una cadena. Si la sangría de cadena es algo así como> – <, entonces esto y la respuesta aceptada no funcionarían. En este caso, la solución de c0rd que usa stringbuilder se ve bien, aunque la sobrecarga de stringbuilder puede no ser la más eficaz. Una opción es construir una matriz de cadenas, rellenarlo con sangrías y luego concat. Para pizca:

 int Indent = 2; string[] sarray = new string[6]; //assuming max of 6 levels of indent, 0 based for (int iter = 0; iter < 6; iter++) { //using c0rd's stringbuilder concept, insert ABC as the indent characters to demonstrate any string can be used sarray[iter] = new StringBuilder().Insert(0, "ABC", iter).ToString(); } Console.WriteLine(sarray[Indent] +"blah"); //now pretend to output some indented line 

A todos nos encanta una solución inteligente, pero a veces lo mejor es lo mejor.

Sorprendido, nadie fue a la vieja escuela. No estoy haciendo ningún reclamo sobre este código, solo por diversión:

 public static string Repeat(this string @this, int count) { var dest = new char[@this.Length * count]; for (int i = 0; i < dest.Length; i += 1) { dest[i] = @this[i % @this.Length]; } return new string(dest); } 

No estoy seguro de cómo funcionaría esto, pero es una pieza fácil de código. (Probablemente he hecho que parezca más complicado de lo que es).

 int indentCount = 3; string indent = "---"; string stringToBeIndented = "Blah"; // Need dummy char NOT in stringToBeIndented - vertical tab, anyone? char dummy = '\v'; stringToBeIndented.PadLeft(stringToBeIndented.Length + indentCount, dummy).Replace(dummy.ToString(), indent); 

Alternativamente, si conoce la cantidad máxima de niveles que puede esperar, puede declarar una matriz y un índice. Probablemente quieras hacer esta matriz estática o una constante.

 string[] indents = new string[4] { "", indent, indent.Replace("-", "--"), indent.Replace("-", "---"), indent.Replace("-", "----") }; output = indents[indentCount] + stringToBeIndented; 

No tengo suficientes representantes para comentar la respuesta de Adam, pero la mejor manera de hacerlo es:

 public static string RepeatString(string content, int numTimes) { if(!string.IsNullOrEmpty(content) && numTimes > 0) { StringBuilder builder = new StringBuilder(content.Length * numTimes); for(int i = 0; i < numTimes; i++) builder.Append(content); return builder.ToString(); } return string.Empty; } 

Debe verificar si numTimes es mayor que cero; de lo contrario, recibirá una excepción.

Otro enfoque es considerar string como IEnumerable y tener un método de extensión genérico que multiplicará los elementos en una colección por el factor especificado.

 public static IEnumerable Repeat(this IEnumerable source, int times) { source = source.ToArray(); return Enumerable.Range(0, times).SelectMany(_ => source); } 

Entonces en tu caso:

 string indent = "---"; var f = string.Concat(indent.Repeat(0)); //.NET 4 required //or var g = new string(indent.Repeat(5).ToArray()); 

No vi esta solución. Me resulta más simple para donde estoy actualmente en el desarrollo de software:

 public static void PrintFigure(int shapeSize) { string figure = "\\/"; for (int loopTwo = 1; loopTwo <= shapeSize - 1; loopTwo++) { Console.Write($"{figure}"); } } 

¡Puedes crear un ExtensionMethod para hacer eso!

 public static class StringExtension { public static string Repeat(this string str, int count) { string ret = ""; for (var x = 0; x < count; x++) { ret += str; } return ret; } } 

O usando la solución @Dan Tao:

 public static class StringExtension { public static string Repeat(this string str, int count) { if (count == 0) return ""; return string.Concat(Enumerable.Repeat(indent, N)) } }