passaggio parametri per valore o riferimento c#




Il modo migliore per ripetere un personaggio in C# (13)

Qual è il modo migliore per generare una stringa di \t in C #

Sto imparando C # e sperimentando diversi modi di dire la stessa cosa.

Tabs(uint t) è una funzione che restituisce una string con la quantità di \t 's

Ad esempio Tabs(3) restituisce "\t\t\t"

Quale di queste tre modalità di implementazione delle Tabs(uint numTabs) è la migliore?

Ovviamente ciò dipende da cosa "meglio" significa.

  1. La versione LINQ è solo due righe, il che è bello. Ma le chiamate a Ripetere e Aggregare inutilmente richiedono tempo / risorse?

  2. La versione StringBuilder è molto chiara ma la classe StringBuilder è in qualche modo più lenta?

  3. La versione string è di base, il che significa che è facile da capire.

  4. Non importa affatto? Sono tutti uguali?

Queste sono tutte domande per aiutarmi a capire meglio 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; 
}

È possibile creare un metodo di estensione

static class MyExtensions
{
    internal static string Repeat(this char c, int n)
    {
        return new string(c, n);
    }
}

Quindi puoi usarlo in questo modo

Console.WriteLine('\t'.Repeat(10));

Anche se molto simile a un precedente suggerimento, mi piace mantenerlo semplice e applicare quanto segue:

string MyFancyString = "*";
int strLength = 50;
System.Console.WriteLine(MyFancyString.PadRight(strLength, "*");

Standard .Net davvero,


Che dire di questo:

string tabs = new String('\t', n);

Dove n è il numero di volte che vuoi ripetere la stringa.

O meglio:

static string Tabs(int n)
{
    return new String('\t', n);
}

Cosa ne pensi di questo:

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

E ancora un altro metodo

new System.Text.StringBuilder().Append('\t', 100).ToString()

Il tuo primo esempio che utilizza Enumerable.Repeat :

private string Tabs(uint numTabs)
{
    IEnumerable<string> tabs = Enumerable.Repeat(
                                 "\t", (int) numTabs);
    return (numTabs > 0) ? 
            tabs.Aggregate((sum, next) => sum + next) : ""; 
} 

può essere riscritto in modo più compatto con String.Concat :

private string Tabs(uint numTabs)
{       
    return String.Concat(Enumerable.Repeat("\t", (int) numTabs));
}

La risposta dipende davvero dalla complessità che desideri. Per esempio, voglio delineare tutti i miei rientri con una barra verticale, quindi la mia stringa di indentazione è determinata come segue:

return new string(Enumerable.Range(0, indentSize*indent).Select(
  n => n%4 == 0 ? '|' : ' ').ToArray());

La versione migliore è sicuramente quella di usare il modo integrato:

string Tabs(int len) { return new string('\t', len); }

Tra le altre soluzioni, preferisco quella più semplice; solo se questo si sta rivelando troppo lento, cerca una soluzione più efficiente.

Se si utilizza un oggetto StringBuilder e si conosce la lunghezza risultante in anticipo, utilizzare anche un costruttore appropriato, questo è molto più efficiente perché significa che viene eseguita solo un'assegnazione che richiede tempo e nessuna copia di dati non necessaria. Sciocchezze: ovviamente il codice sopra è più efficiente.


Per me va bene:

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

Prova questo:

  1. Aggiungi riferimento Microsoft.VisualBasic
  2. Usa: String result = Microsoft.VisualBasic.Strings.StrDup (5, "ciao");
  3. Fammi sapere se funziona per te.

So che questa domanda ha già cinque anni ma c'è un modo semplice per ripetere una stringa che funziona anche in .Net 2.0.

Per ripetere una stringa:

string repeated = new String('+', 3).Replace("+", "Hello, ");

ritorna

"Ciao ciao ciao, "

Per ripetere una stringa come array:

// 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(',');

ritorna

{"Ciao ciao ciao", ""}

Mantienilo semplice.


Utilizzo di String.Concat e Enumerable.Repeat che sarà meno costoso rispetto all'utilizzo di String.Join

public static Repeat(this String pattern, int count)
{
    return String.Concat(Enumerable.Repeat(pattern, count));
}

var str = new string(Enumerable.Repeat('\t', numTabs).ToArray());




string