J'ai ce qui suit
data.AppendFormat("{0},",dataToAppend);
Le problème avec ceci est que je l'utilise en boucle et qu'il y aura une virgule d'essai. Quelle est la meilleure façon de supprimer la virgule de fin?
Dois-je changer les données en une chaîne de la sous-chaîne?
c#
stringbuilder
Wesley Skeen
la source
la source
string.Join(",", yourCollection)
? Edit: ajouté comme réponse.Réponses:
Le moyen le plus simple et le plus efficace consiste à exécuter cette commande:
en faisant cela, vous déplacez le pointeur (c'est-à-dire le dernier index) en arrière d'un caractère mais vous ne changez pas la mutabilité de l'objet. En fait, il
StringBuilder
vaut mieux effacer aLength
aussi (mais utilisez plutôt laClear()
méthode pour plus de clarté car c'est à cela que ressemble son implémentation):encore une fois, car cela ne change pas la table d'allocation. Pensez-y comme si vous disiez que je ne veux plus reconnaître ces octets. Maintenant, même en appelant
ToString()
, il ne reconnaîtra rien après sonLength
, eh bien, il ne le peut pas. C'est un objet mutable qui alloue plus d'espace que ce que vous lui fournissez, il est simplement construit de cette façon.la source
data.Length = 0;
: c'est exactement ce queStringBuilder.Clear
fait, il est donc préférable d'utiliserStringBuilder.Clear
pour la clarté de l'intention.Clear()
fait, mais c'est drôle. C'est la première ligne de laClear()
méthode. Mais saviez-vous que l'interface émet alors un fichierreturn this;
. Voilà ce qui me tue. En définissant lesLength = 0
modifications de la référence que vous avez déjà, pourquoi revenir vous-même?Append
se retourne également.Juste utiliser
De cette façon, vous n'avez pas besoin de
StringBuilder
la boucle et.Ajout long sur le cas asynchrone. À partir de 2019, ce n'est pas une configuration rare lorsque les données arrivent de manière asynchrone.
Dans le cas où vos données sont dans une collection asynchrone, il n'y a pas de
string.Join
prise de surchargeIAsyncEnumerable<T>
. Mais il est facile d'en créer un manuellement, en piratant le code à partir destring.Join
:Si les données arrivent de manière asynchrone mais que l'interface
IAsyncEnumerable<T>
n'est pas prise en charge (comme mentionné dans les commentairesSqlDataReader
), il est relativement facile d'encapsuler les données dans unIAsyncEnumerable<T>
:et utilisez-le:
Pour l'utiliser
Select
, vous devrez utiliser le package nugetSystem.Interactive.Async
. Ici vous pouvez trouver un exemple compilable.la source
string.Join(",", yourCollection)
a encore un,
à la fin. donc ce qui précèdestring.Join(",", yourCollection)
est inefficace et ne le supprime pas tout seul.Utilisez ce qui suit après la boucle.
ou simplement changer pour
la source
string.Join(",", input)
Que dis-tu de ça..
la source
Je préfère manipuler la longueur du stringbuilder:
la source
data.Length--
ou--data.Length
?--
ou++
vous pouvez utiliserdata.Length -= 1
cependant, ou cette réponse fonctionnera également.Je recommande, vous changez votre algorithme de boucle:
la source
Vous devez utiliser la
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, ainsi que la construction efficace de la chaîne (sans chaînes intermédiaires inutiles).la source
Oui, convertissez-le en chaîne une fois la boucle terminée:
la source
Vous avez deux options. La première est une
Remove
méthode d' utilisation très facile , elle est assez efficace. La deuxième méthode consiste à utiliserToString
avec l'index de début et l'index de fin ( documentation MSDN )la source
Question SO similaire ici.
J'ai aimé l'utilisation d'une méthode d'extension StringBuilder.
RemoveLast, méthode
la source
Le moyen le plus simple serait d'utiliser la méthode Join ():
Si vous avez vraiment besoin de StringBuilder, coupez la virgule de fin après la boucle:
la source
data.ToString().TrimEnd(',');
est inefficace