web-dev-qa-db-fra.com

Meilleure façon de supprimer le dernier caractère d'une chaîne créée avec stringbuilder

J'ai le suivant

data.AppendFormat("{0},",dataToAppend);

Le problème, c'est que je l'utilise en boucle et qu'il y aura une virgule de test. Quel est le meilleur moyen de supprimer la virgule de fin?

Dois-je changer les données en chaîne la sous-chaîne?

74
Wesley Skeen

Le plus simple et moyen le plus efficace consiste à exécuter cette commande:

data.Length--;

en faisant cela, vous déplacez le pointeur (c'est-à-dire le dernier index) d'un caractère, mais vous ne modifiez pas la mutabilité de l'objet. En fait, effacer un StringBuilder est également préférable avec Length (mais utilisez la méthode Clear() pour plus de clarté, car c'est ce à quoi ressemble son implémentation):

data.Length = 0;

encore une fois, car cela ne change pas la table de répartition. Pensez-y comme si vous disiez: je ne veux plus reconnaître ces octets. Maintenant, même en appelant ToString(), il ne reconnaîtra rien au-delà de son Length, eh bien, il ne le peut pas. C'est un objet modifiable qui alloue plus d'espace que ce que vous lui fournissez, il est simplement construit de cette façon.

190
Mike Perrenoud

Juste utiliser

string.Join(",", yourCollection)

De cette façon, vous n'avez pas besoin de StringBuilder et de la boucle.

36
Vlad

Utilisez ce qui suit après la boucle.

.TrimEnd(',')

ou simplement changer en

string commaSeparatedList = input.Aggregate((a, x) => a + ", " + x)
10
Sam Leach

Que dis-tu de ça..

string str = "The quick brown fox jumps over the lazy dog,";
StringBuilder sb = new StringBuilder(str);
sb.Remove(str.Length - 1, 1);
8
Pankaj

Je préfère manipuler la longueur du constructeur de chaînes:

data.Length = data.Length - 1;
7
bastos.sergio

Je vous recommande de changer votre algorithme de boucle:

  • Ajouter la virgule pas APRÈS l'élément, mais AVANT
  • Utilisez une variable booléenne, qui commence par false, supprime la première virgule
  • Définissez cette variable booléenne sur true après l'avoir testée
3
Eugen Rieck

Vous devriez utiliser le string.Join méthode pour transformer une collection d'éléments en une chaîne délimitée par des virgules. Cela garantira qu'il n'y a pas de virgule de début ou de fin, et que la chaîne est construite efficacement (sans chaînes intermédiaires inutiles).

3
Servy

Oui, convertissez-le en chaîne une fois la boucle effectuée:

String str = data.ToString().TrimEnd(',');
2
DonBoitnott

Vous avez deux options. Le premier est très facile à utiliser Remove la méthode est très efficace. La deuxième méthode consiste à utiliser ToString avec les index de début et de fin ( documentation MSDN )

2
Piotr Stapp

similaire SO question ici.

J'ai aimé utiliser une méthode d'extension StringBuilder.

Méthode RemoveLast

2
MrB

Le moyen le plus simple serait d'utiliser la méthode Join ():

public static void Trail()
{
    var list = new List<string> { "lala", "lulu", "lele" };
    var data = string.Join(",", list);
}

Si vous avez vraiment besoin de StringBuilder, coupez la virgule de fin après la boucle:

data.ToString().TrimEnd(',');
1
studert