141 votes

Puis-je "multiplier" une chaîne (en C#) ?

Supposons que j'ai une chaîne de caractères, par exemple,

chaîne snip =  "";

Je veux essentiellement l'écrire plusieurs fois, en fonction d'une valeur entière.

chaîne snip =  "";
int multiplicateur = 2;

// TODO: code magique pour le faire 
// snip * multiplicateur = "";

EDIT: Je sais que je peux facilement écrire ma propre fonction pour implémenter cela, je me demandais juste s'il y avait un opérateur de chaîne bizarre que je ne connaissais pas.

0 votes

237voto

Will Dean Points 25866

Dans .NET 4, vous pouvez faire ceci :

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

9 votes

Et ce n'est pas beaucoup plus en .NET 3.5: String.Concat(Enumerable.Repeat("Bonjour", 4).ToArray())

4 votes

Je ne pense pas que ce soit du tout élégant. En python, le code pour faire ceci est : snip * multiplicateur (Ce n'est pas horrible.. mais ce n'est pas non plus beau).

9 votes

@dementedhedgehog Je sais que vous reconnaissez votre propre démence, mais même en souffrant comme vous le faites, vous pourriez peut-être voir qu'un exemple en Python n'aurait pas été une très bonne réponse à une question en C#... Je pense que la plupart d'entre nous peuvent voir que le choix du langage est toujours un compromis, et à peu près n'importe quelle réponse à n'importe quelle question pourrait être accompagnée d'un plaidoyer, que ce soit pour ou contre.

115voto

James Curran Points 55356

Notez que si votre "chaîne" est un seul caractère, il existe une surcharge du constructeur de chaîne pour le gérer :

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

3 votes

Il s'agit vraiment de professionnels.

62voto

Tamas Czinege Points 49277

Malheureusement / heureusement, la classe de chaîne est scellée, vous ne pouvez donc pas en hériter et surcharger l'opérateur *. Cependant, vous pouvez créer une méthode d'extension :

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 = "".Multiply(10);

5 votes

Tout juste là où je vais! Vous pourriez probablement optimiser en utilisant source.Length * multiplier dans le StringBuilder ctor

2 votes

Le commentaire de Marc était juste là où je voulais aller :)

1 votes

Vous avez besoin de (source.Length * multiplicateur), pas seulement de (multiplicateur)

12voto

LukeH Points 110965

Je suis d'accord avec DrJokepu sur ce point, mais si pour une raison quelconque vous vouliez tricher en utilisant une fonctionnalité intégrée, vous pourriez faire quelque chose comme ceci:

chaîne snip = "";
int multiplicateur = 2;

chaîne résultat = string.Join(snip, new string[multiplier + 1]);

Ou, si vous utilisez .NET 4:

chaîne résultat = string.Concat(Enumerable.Repeat(snip, multiplicateur));

Personnellement, je ne m'embêterais pas - une méthode d'extension personnalisée est bien meilleure.

1 votes

Je n'ai jamais su qu'il y avait une triche comme ça. =)

10voto

user51710 Points 641

Juste pour des raisons de complétude - voici une autre manière de le faire :

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

Je crois avoir trouvé cette solution sur Stack Overflow il y a quelque temps, donc ce n'est pas mon idée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X