c# - valores - numeros repetidos en un arreglo c
La mejor manera de repetir un personaje en C# (19)
Cuál es la mejor manera de generar una cadena de /t
''s en C #
Estoy aprendiendo C # y experimentando con diferentes maneras 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 implementar Tabs(uint numTabs)
es la mejor?
Por supuesto que depende de lo que significa "mejor".
La versión LINQ es solo de dos líneas, lo cual es bueno. ¿Pero las llamadas a Repetir y agregar innecesariamente tiempo / recursos consumen?
La versión de
StringBuilder
es muy clara, pero ¿es la claseStringBuilder
alguna manera más lenta?La versión de
string
es básica, lo que significa que es fácil de entender.¿No importa en absoluto? ¿Son todos iguales?
Estas son todas las preguntas que me ayudan 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;
}
¿Qué hay de usar el método de extensión?
public static class StringExtensions
{
public static string Repeat(this char chatToRepeat, int repeat) {
return new string(chatToRepeat,repeat);
}
public static string Repeat(this string stringToRepeat,int repeat)
{
var builder = new StringBuilder(repeat*stringToRepeat.Length);
for (int i = 0; i < repeat; i++) {
builder.Append(stringToRepeat);
}
return builder.ToString();
}
}
Entonces podrías escribir:
Debug.WriteLine(''-''.Repeat(100)); // For Chars
Debug.WriteLine("Hello".Repeat(100)); // For Strings
Tenga en cuenta que una prueba de rendimiento del uso de la versión de stringbuilder para caracteres simples en lugar de cadenas le otorga una gran penalidad de rendimiento: en mi computadora la diferencia en el rendimiento medido es 1:20 entre: Debug.WriteLine (''-''. Repeat (1000000)) // versión char y
Debug.WriteLine ("-". Repeat (1000000)) // versión de cadena
¿Qué pasa con esto?
string tabs = new String(''/t'', n);
Donde n
es el número de veces que desea repetir la cadena.
O mejor:
static string Tabs(int n)
{
return new String(''/t'', n);
}
Aunque es muy similar a una sugerencia anterior, me gusta que sea simple y aplicar lo siguiente:
string MyFancyString = "*";
int strLength = 50;
System.Console.WriteLine(MyFancyString.PadRight(strLength, "*");
Standard .Net realmente,
Digamos que quiere repetir ''/ t'' n número de veces, puede usar;
String.Empty.PadRight(n,''/t'')
En todas las versiones de .NET, puedes repetir una cadena así:
public static string Repeat(string value, int count)
{
return new StringBuilder(value.Length * count).Insert(0, value, count).ToString();
}
Para repetir un personaje, la new String(''/t'', count)
es tu mejor apuesta. Vea share .
La mejor versión es, sin duda, utilizar la forma incorporada:
string Tabs(int len) { return new string(''/t'', len); }
De las otras soluciones, preferimos las más fáciles; solo si esto resulta demasiado lento, procure una solución más eficiente.
Si usa un Tonterías: por supuesto que el código anterior es más eficiente. StringBuilder
y conoce de antemano su longitud resultante, entonces también usa un constructor apropiado, esto es mucho más eficiente porque significa que solo se realiza una asignación que requiere mucho tiempo y no se realiza una copia innecesaria de datos.
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:
return new string(Enumerable.Range(0, indentSize*indent).Select(
n => n%4 == 0 ? ''|'' : '' '').ToArray());
Métodos de extensión:
public static string Repeat(this string s, int n)
{
return new String(Enumerable.Range(0, n).SelectMany(x => s).ToArray());
}
public static string Repeat(this char c, int n)
{
return new String(c, n);
}
Para mi esta bien
public static class Utils
{
public static string LeftZerosFormatter(int zeros, int val)
{
string valstr = val.ToString();
valstr = new string(''0'', zeros) + valstr;
return valstr.Substring(valstr.Length - zeros, zeros);
}
}
Prueba esto:
- Añadir referencia de Microsoft.VisualBasic
- Use: String result = Microsoft.VisualBasic.Strings.StrDup (5, "hi");
- Déjame saber si te funciona.
Puedes crear un método de extensión.
static class MyExtensions
{
internal static string Repeat(this char c, int n)
{
return new string(c, n);
}
}
Entonces puedes usarlo así
Console.WriteLine(''/t''.Repeat(10));
Qué tal esto:
//Repeats a character specified number of times
public static string Repeat(char character,int numberOfIterations)
{
return "".PadLeft(numberOfIterations, character);
}
//Call the Repeat method
Console.WriteLine(Repeat(''/t'',40));
Sé que esta pregunta ya tiene cinco años, pero hay una forma sencilla de repetir una cadena que incluso funciona en .Net 2.0.
Para repetir una cadena:
string repeated = new String(''+'', 3).Replace("+", "Hello, ");
Devoluciones
"Hola hola hola, "
Para repetir una cadena como una matriz:
// Two line version.
string repeated = new String(''+'', 3).Replace("+", "Hello,");
string[] repeatedArray = repeated.Split('','');
// One line version.
string[] repeatedArray = new String(''+'', 3).Replace("+", "Hello,").Split('','');
Devoluciones
{"Hola hola hola", ""}
Mantenlo simple.
Sin lugar a dudas, la respuesta aceptada es la mejor y más rápida manera de repetir un solo carácter.
La respuesta de Binoj Anthony es una manera simple y bastante eficiente de repetir una cuerda.
Sin embargo, si no le importa un poco más de código, puede usar mi técnica de relleno de matrices para crear eficientemente estas cadenas incluso más rápido. En mis pruebas de comparación, el siguiente código se ejecuta en aproximadamente el 35% del tiempo del código StringBuilder.Insert.
public static string Repeat(this string value, int count)
{
var values = new char[count * value.Length];
values.Fill(value.ToCharArray());
return new string(values);
}
public static void Fill<T>(this T[] destinationArray, params T[] value)
{
if (destinationArray == null)
{
throw new ArgumentNullException("destinationArray");
}
if (value.Length > destinationArray.Length)
{
throw new ArgumentException("Length of value array must not be more than length of destination");
}
// set the initial array value
Array.Copy(value, destinationArray, value.Length);
int copyLength, nextCopyLength;
for (copyLength = value.Length; (nextCopyLength = copyLength << 1) < destinationArray.Length; copyLength = nextCopyLength)
{
Array.Copy(destinationArray, 0, destinationArray, copyLength, copyLength);
}
Array.Copy(destinationArray, 0, destinationArray, copyLength, destinationArray.Length - copyLength);
}
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
Tu primer ejemplo que utiliza Enumerable.Repeat
:
private string Tabs(uint numTabs)
{
IEnumerable<string> tabs = Enumerable.Repeat(
"/t", (int) numTabs);
return (numTabs > 0) ?
tabs.Aggregate((sum, next) => sum + next) : "";
}
se puede reescribir de forma más compacta con String.Concat
:
private string Tabs(uint numTabs)
{
return String.Concat(Enumerable.Repeat("/t", (int) numTabs));
}
Usar String.Concat
y Enumerable.Repeat
que será menos costoso que usar String.Join
public static Repeat(this String pattern, int count)
{
return String.Concat(Enumerable.Repeat(pattern, count));
}
Y otro método más.
new System.Text.StringBuilder().Append(''/t'', 100).ToString()
string.Concat(Enumerable.Repeat("ab", 2));
Devoluciones
abab
Y
string.Concat(Enumerable.Repeat("a", 2));
Devoluciones
"Automóvil club británico"
desde...
¿Hay una función incorporada para repetir la cadena o el carácter en .net?
var str = new string(Enumerable.Repeat(''/t'', numTabs).ToArray());