J'essaie d'insérer un certain nombre d'indentations avant une chaîne en fonction de la profondeur des éléments et je me demande s'il existe un moyen de renvoyer une chaîne répétée X fois. Exemple:
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 "---------".
String
classe surchargé ne prend pas de chaîne comme paramètre pour en créer des répétitions, ce qui aurait pu faire de la réponse acceptée un ajustement parfait.Réponses:
Si vous ne souhaitez répéter que le même caractère, vous pouvez utiliser le constructeur de chaîne qui accepte un caractère et le nombre de fois pour le répéter
new String(char c, int count)
.Par exemple, pour répéter un tiret cinq fois:
la source
Si vous utilisez .NET 4.0, vous pouvez l'utiliser
string.Concat
avecEnumerable.Repeat
.Sinon, j'irais avec quelque chose comme la réponse d'Adam .
La raison pour laquelle je ne conseillerais généralement pas d' utiliser la réponse d'Andrey est simplement que l'
ToArray()
appel introduit des frais généraux superflus qui sont évités avec l'StringBuilder
approche suggérée par Adam. Cela dit, au moins cela fonctionne sans nécessiter .NET 4.0; et c'est rapide et facile (et ne va pas vous tuer si l'efficacité n'est pas trop une préoccupation).la source
Console.WriteLine(string.Concat("-", string.Concat(Enumerable.Repeat(indent, N))));
la source
input.Length * count
auStringBuilder
constructeur, vous ne trouvez pas?input.Length * count
auStringBuilder
constructeur, vous pouvez ignorer leStringBuilder
tout et créer immédiatement un caractère [] de la bonne taille.StringBuilder
, et le code serait moins transparent.solution la plus performante pour la chaîne
la source
Pour de nombreux scénarios, c'est probablement la solution la plus intéressante:
L'utilisation est alors:
Cela s'appuie sur d'autres réponses (en particulier @ c0rd's). En plus de la simplicité, il présente les caractéristiques suivantes, que toutes les autres techniques discutées ne partagent pas:
StringBuilder
la préallocation via le stockage.la source
Utilisez String.PadLeft , si la chaîne souhaitée ne contient qu'un seul caractère.
Crédit dû ici
la source
string
constructeur qui prend unchar
et unint
?String.PadLeft
arguments sont inversés. Lecount
vient avant le caractère de remplissage.Vous pouvez répéter votre chaîne (au cas où ce ne serait pas un seul caractère) et concaténer le résultat, comme ceci:
la source
J'irais pour la réponse de Dan Tao, mais si vous n'utilisez pas .NET 4.0, vous pouvez faire quelque chose comme ça:
la source
la source
J'aime la réponse donnée. Dans le même esprit, c'est ce que j'ai utilisé dans le passé:
"" .PadLeft (3 * tiret, '-')
Cela remplira la création d'un retrait, mais techniquement, la question était de répéter une chaîne. Si le retrait de la chaîne est quelque chose comme> - <alors cela ainsi que la réponse acceptée ne fonctionneraient pas. Dans ce cas, la solution de c0rd utilisant stringbuilder semble bonne, bien que la surcharge de stringbuilder puisse en fait ne pas en faire la plus performante. Une option consiste à créer un tableau de chaînes, à le remplir de chaînes de retrait, puis à le concaténer. Pour:
Nous aimons tous une solution intelligente, mais parfois simple est préférable.
la source
Ajout de la méthode d'extension que j'utilise partout dans mes projets:
J'espère que quelqu'un pourra en profiter ...
la source
Surpris, personne n'est allé à la vieille école. Je ne fais aucune réclamation sur ce code, mais juste pour le plaisir:
la source
Je ne sais pas comment cela fonctionnerait, mais c'est un morceau de code facile. (Je l'ai probablement rendu plus compliqué qu'il ne l'est.)
Alternativement, si vous connaissez le nombre maximum de niveaux auxquels vous pouvez vous attendre, vous pouvez simplement déclarer un tableau et l'indexer. Vous voudrez probablement rendre ce tableau statique ou constant.
la source
Je n'ai pas assez de représentant pour commenter la réponse d'Adam, mais la meilleure façon de le faire imo est comme ceci:
Vous devez vérifier pour voir si numTimes est supérieur à zéro, sinon vous obtiendrez une exception.
la source
Je n'ai pas vu cette solution. Je trouve cela plus simple pour ma situation actuelle en développement logiciel:
la source
Pour une utilisation générale, les solutions impliquant la classe StringBuilder sont les meilleures pour répéter des chaînes à plusieurs caractères. Il est optimisé pour gérer la combinaison d'un grand nombre de chaînes d'une manière que la concaténation simple ne peut pas et qui serait difficile ou impossible à faire plus efficacement à la main. Les solutions StringBuilder présentées ici utilisent O (N) itérations pour terminer, un taux forfaitaire proportionnel au nombre de répétitions.
Cependant, pour un très grand nombre de répétitions, ou lorsque des niveaux élevés d'efficacité doivent être éliminés, une meilleure approche consiste à faire quelque chose de similaire aux fonctionnalités de base de StringBuilder mais à produire des copies supplémentaires à partir de la destination, plutôt qu'à partir de la chaîne d'origine, comme ci-dessous.
Cela double la longueur de la chaîne source / destination à chaque itération, ce qui évite la réinitialisation des compteurs à chaque fois qu'elle parcourt la chaîne d'origine, au lieu de cela de lire et de copier en douceur la chaîne désormais beaucoup plus longue, ce que les processeurs modernes peuvent faire beaucoup. plus efficacement.
Il utilise un logarithme en base 2 pour trouver le nombre de fois qu'il a besoin de doubler la longueur de la chaîne, puis continue de le faire autant de fois. Étant donné que le reste à copier est désormais inférieur à la longueur totale à partir de laquelle il copie, il peut alors simplement copier un sous-ensemble de ce qu'il a déjà généré.
J'ai utilisé la méthode Array.Copy () sur l'utilisation de StringBuilder, car une copie du contenu de StringBuilder en lui-même aurait pour surcharge de produire une nouvelle chaîne avec ce contenu à chaque itération. Array.Copy () évite cela, tout en fonctionnant avec un taux d'efficacité extrêmement élevé.
Cette solution prend O (1 + log N) pour terminer, un taux qui augmente logarithmiquement avec le nombre de répétitions (doubler le nombre de répétitions équivaut à une itération supplémentaire), une économie substantielle par rapport aux autres méthodes, qui augmentent proportionnellement.
la source
Une autre approche consiste à considérer
string
commeIEnumerable<char>
et ont une méthode d'extension générique qui multipliera les éléments d'une collection par le facteur spécifié.Donc dans votre cas:
la source
Imprimez une ligne avec répétition.
la source
Vous pouvez créer une ExtensionMethod pour ce faire!
Ou en utilisant la solution @Dan Tao:
la source