visual valid name method example documentacion comment comentarios c# .net

valid - summary param name c#



¿Hay una manera fácil de devolver una cadena repetida X veces? (15)

Estoy tratando de insertar un cierto número de sangrías 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 "---------".


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


Iría por la respuesta de Dan Tao, pero si no está utilizando .NET 4.0, puede 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(); }


La solución más eficaz para cuerdas.

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


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

"" .PadLeft (3 * sangría, ''-'')

Esto cumplirá la creación de 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 y la respuesta aceptada no funcionarán. En este caso, la solución de c0rd que usa stringbuilder se ve bien, aunque la sobrecarga de stringbuilder puede, de hecho, no hacerla la más eficiente. Una opción es crear una matriz de cadenas, rellenarla con cadenas de sangría y luego concentrarla. A la 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

Todos amamos una solución inteligente, pero a veces simple es lo mejor.


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, simplemente puede declarar una matriz e indexar en ella. Probablemente querrá que esta matriz sea estática o constante.

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


No tengo suficiente representante para comentar la respuesta de Adam, pero la mejor manera de hacerlo es imo así:

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 obtendrá una excepción.


No vi esta solución. Lo encuentro 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}"); } }


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

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

Así que en tu caso:

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


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

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:

  • Repetición de una cadena de cualquier longitud, no solo un carácter (como lo solicita el OP).
  • Uso eficiente de StringBuilder través de preasignación de almacenamiento.

Si está utilizando .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, me gustaría algo así como la respuesta de Adam .

La razón por la que generalmente no recomendaría usar la respuesta de Andrey es simplemente que la llamada ToArray() introduce una sobrecarga superflua que se evita con el enfoque de StringBuilder sugerido por Adam. Dicho esto, al menos funciona sin requerir .NET 4.0; y es rápido y fácil (y no te matará si la eficiencia no es una gran preocupación).


Si solo pretende repetir el mismo carácter, puede usar el constructor de cadenas que acepta un carácter y el número de veces para repetirlo. new String(char c, int count) .

Por ejemplo, para repetir un guión cinco veces:

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


Sorprendido nadie fue a la vieja escuela. No estoy haciendo ninguna reclamación sobre este código, pero 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); }


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

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

Crédito debido here


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


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