Quelle est la meilleure façon de générer une chaîne de \t
'en C #
J'apprends le C # et j'expérimente différentes façons de dire la même chose.
Tabs(uint t)
est une fonction qui renvoie une string
avec t
quantité de \t
« s
Par exemple, Tabs(3)
retourne"\t\t\t"
Laquelle de ces trois façons de mettre en œuvre Tabs(uint numTabs)
est la meilleure?
Bien sûr, cela dépend de ce que signifie le "meilleur".
La version LINQ n'est que de deux lignes, ce qui est bien. Mais les appels à Répéter et à Agréger prennent-ils inutilement du temps / des ressources?
La
StringBuilder
version est très claire mais laStringBuilder
classe est-elle en quelque sorte plus lente?La
string
version est basique, ce qui signifie qu'elle est facile à comprendre.Cela n'a-t-il aucune importance? Sont-ils tous égaux?
Ce sont toutes des questions pour m'aider à mieux comprendre 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;
}
Retour
Et
Retour
de...
Existe-t-il une fonction intégrée pour répéter la chaîne ou le caractère dans .net?
la source
StruingBuilder
!string.Join
était plus rapide dans l'exemple car ils utilisaient un délimiteur d'espace.string.Concat
est approprié lorsqu'il n'y a pas de délimiteur.Dans toutes les versions de .NET, vous pouvez répéter une chaîne ainsi:
Pour répéter un personnage,
new String('\t', count)
c'est votre meilleur pari. Voir la réponse de @CMS .la source
La meilleure version est certainement d'utiliser la méthode intégrée:
Parmi les autres solutions, préférez la plus simple; seulement si cela s'avère trop lent, essayez une solution plus efficace.
Si vous utilisez unNon-sens: bien sûr, le code ci-dessus est plus efficace.StringBuilder
et connaissez sa longueur résultante à l'avance, puis utilisez également un constructeur approprié, cela est beaucoup plus efficace car cela signifie qu'une seule allocation chronophage a lieu, et aucune copie inutile des données.la source
new string('\t', len)
être entre 2x et 7x plus rapides que l'StringBuilder
approche. Pourquoi pensez-vousStringBuilder
est plus efficace dans ce cas?Méthodes d'extension:
la source
Enumerable.Range(0, n).SelectMany(x => s)
peut être remplacé par un simpleEnumerable.Repeat(s, n)
.SelectMany
volonté de chaque mannequinx
donne une séquence dechar
valeurs (depuis lesstring s
implémentationsIEnumerable<char>
), et toutes ceschar
séquences sont concaténées en une longuechar
séquence. Ce que vous proposez donnera plutôt unIEnumerable<string>
. Ce n'est pas pareil.Enumerable.Repeat
, je concaténer les chaînes ensemble:string.Concat(Enumerable.Repeat(s, n))
. Cela a déjà été publié auparavant .Qu'en est-il de l'utilisation de la méthode d'extension?
Vous pourriez alors écrire:
Notez qu'un test de performance d'utilisation de la version stringbuilder pour des caractères simples au lieu de chaînes vous donne une pénalité de préformance majeure: sur mon ordinateur, la différence de performances mesurées est de 1:20 entre: Debug.WriteLine ('-'. Repeat (1000000)) // version char et
Debug.WriteLine ("-". Repeat (1000000)) // version chaîne
la source
StringBuilder.Insert(Int32, String, Int32)
, comme Binoj Anthony a répondu .Que dis-tu de ça:
la source
new string('\t', 10)
c'était la meilleure solutionJe sais que cette question a déjà cinq ans, mais il existe un moyen simple de répéter une chaîne qui fonctionne même dans .Net 2.0.
Pour répéter une chaîne:
Retour
Pour répéter une chaîne sous forme de tableau:
Retour
Rester simple.
la source
Disons que vous voulez répéter '\ t' n nombre de fois, vous pouvez utiliser;
la source
Votre premier exemple qui utilise
Enumerable.Repeat
:peut être réécrit de manière plus compacte avec
String.Concat
:la source
Utiliser
String.Concat
etEnumerable.Repeat
qui sera moins cher que d'utiliserString.Join
la source
la source
La réponse dépend vraiment de la complexité que vous souhaitez. Par exemple, je veux décrire tous mes retraits avec une barre verticale, donc ma chaîne de retrait est déterminée comme suit:
la source
Et encore une autre méthode
la source
StringBuilder
constructeur enregistre la réallocation. Pourtant, c'est plus bavard et moins efficace que d'utiliser lestring
constructeur qui peut répéter un caractère donné, comme déjà montré dans la réponse acceptée.Pour moi, c'est bien:
la source
Vous pouvez créer une méthode d'extension
Ensuite, vous pouvez l'utiliser comme ceci
la source
Sans aucun doute, la réponse acceptée est le moyen le meilleur et le plus rapide de répéter un seul caractère.
La réponse de Binoj Anthony est un moyen simple et assez efficace de répéter une chaîne.
Cependant, si cela ne vous dérange pas un peu plus de code, vous pouvez utiliser ma technique de remplissage de tableau pour créer efficacement ces chaînes encore plus rapidement. Dans mes tests de comparaison, le code ci-dessous exécuté dans environ 35% du temps du code StringBuilder.Insert.
Pour plus d'informations sur cette technique de remplissage de tableau, voir Méthode la plus rapide pour remplir un tableau avec une seule valeur
la source
Essaye ça:
la source
Bien que très similaire à une suggestion précédente, j'aime rester simple et appliquer ce qui suit:
Standard .Net vraiment,
la source