non must metodo method generic extension extended enum definicion custom c# string extension-methods

c# - metodo - extension method must be defined in a non-generic static class



¿Puedo "multiplicar" una cuerda(en C#)? (13)

Aquí está mi opinión sobre esto solo para futuras referencias:

/// <summary> /// Repeats a System.String instance by the number of times specified; /// Each copy of thisString is separated by a separator /// </summary> /// <param name="thisString"> /// The current string to be repeated /// </param> /// <param name="separator"> /// Separator in between copies of thisString /// </param> /// <param name="repeatTimes"> /// The number of times thisString is repeated</param> /// <returns> /// A repeated copy of thisString by repeatTimes times /// and separated by the separator /// </returns> public static string Repeat(this string thisString, string separator, int repeatTimes) { return string.Join(separator, ParallelEnumerable.Repeat(thisString, repeatTimes)); }

Supongamos que tengo una cadena, por ejemplo,

string snip = "</li></ul>";

Quiero básicamente escribirlo varias veces, dependiendo de algún valor entero.

string snip = "</li></ul>"; int multiplier = 2; // TODO: magic code to do this // snip * multiplier = "</li></ul></li></ul>";

EDITAR: Sé que puedo escribir fácilmente mi propia función para implementar esto, me preguntaba si había algún extraño operador de cadenas que no sabía


Como todos agregan sus propios ejemplos de .NET4 / Linq, también podría agregar los míos. (Básicamente, es DrJokepu, reducido a un solo liner)

public static string Multiply(this string source, int multiplier) { return Enumerable.Range(1,multiplier) .Aggregate(new StringBuilder(multiplier*source.Length), (sb, n)=>sb.Append(source)) .ToString(); }


De acuerdo, aquí está mi opinión sobre el asunto:

public static class ExtensionMethods { public static string Multiply(this string text, int count) { return new string(Enumerable.Repeat(text, count) .SelectMany(s => s.ToCharArray()).ToArray()); } }

Estoy siendo un poco tonto por supuesto, pero cuando necesito tener tabulación en las clases generadoras de código, Enumerable.Repeat lo hace por mí. Y sí, la versión de StringBuilder también está bien.


Desafortunadamente / afortunadamente, la clase de cadena está sellada por lo que no puede heredar de ella y sobrecargar el * operador. Puede crear un método de extensión, aunque:

public static string Multiply(this string source, int multiplier) { StringBuilder sb = new StringBuilder(multiplier * source.Length); for (int i = 0; i < multiplier; i++) { sb.Append(source); } return sb.ToString(); } string s = "</li></ul>".Multiply(10);


En .NET 4 puedes hacer esto:

String.Concat(Enumerable.Repeat("Hello", 4))


Esto es mucho más conciso:

new StringBuilder().Insert(0, "</li></ul>", count).ToString()

El espacio de nombres using System.Text; debe ser importado en este caso.


Si tiene .Net 3.5 pero no 4.0, puede usar System.Linq''s

String.Concat(Enumerable.Range(0, 4).Select(_ => "Hello").ToArray())


Solo por el hecho de estar completo, aquí hay otra forma de hacer esto:

public static string Repeat(this string s, int count) { var _s = new System.Text.StringBuilder().Insert(0, s, count).ToString(); return _s; }

Creo que lo saqué de hace un tiempo, así que no es mi idea.


Tendría que escribir un método, por supuesto, con C # 3.0 podría ser un método de extensión:

public static string Repeat(this string, int count) { /* StringBuilder etc */ }

entonces:

string bar = "abc"; string foo = bar.Repeat(2);


Tenga en cuenta que si su "cadena" es solo un carácter, hay una sobrecarga del constructor de cadena para manejarlo:

int multipler = 10; string TenAs = new string (''A'', multipler);


Un poco tarde (y solo por diversión), si realmente desea usar el operador * para este trabajo, puede hacer esto:

public class StringWrap { private string value; public StringWrap(string v) { this.value = v; } public static string operator *(StringWrap s, int n) { return s.value.Multiply(n); // DrJokepu extension } }

Y entonces:

var newStr = new StringWrap("TO_REPEAT") * 5;

Tenga en cuenta que, siempre que pueda encontrar un comportamiento razonable para ellos, también puede manejar otros operadores a través de la clase StringWrap , como / , ^ , % etc ...

PD:

Multiply() créditos de extensión a @DrJokepu todos los derechos reservados ;-)


Estoy con DrJokepu en este caso , pero si por alguna razón quieres hacer trampa usando la funcionalidad integrada, entonces podrías hacer algo como esto:

string snip = "</li></ul>"; int multiplier = 2; string result = string.Join(snip, new string[multiplier + 1]);

O bien, si usa .NET 4:

string result = string.Concat(Enumerable.Repeat(snip, multiplier));

Personalmente, no me molestaría, un método de extensión personalizado es mucho más agradable.


string Multiply(string input, int times) { StringBuilder sb = new StringBuilder(input.length * times); for (int i = 0; i < times; i++) { sb.Append(input); } return sb.ToString(); }