Le plus efficace moyen de joindre des chaînes
J'ai besoin de concaténer beaucoup de cordes ensemble et mettre une virgule entre l'un d'eux.
J'ai une liste de chaînes de caractères
"123123123213"
"1232113213213"
"123213123"
et je veux obtenir
"123123123213,1232113213213,123213123"
Je me demandais quelle est la meilleure façon d'y parvenir.
Je pouvais le faire comme ceci:
private List<string> stringList = new List<string> {
//a lot of strings in here
"1234567890", "34343434", "4343434" };
string outcome = string.Join(",", stringList.ToArray());
Ou peut-être:
StringBuilder builder = new StringBuilder();
stringList.ForEach(val => {
builder.Append(val);
builder.Append(",");
});
string outcome = builder.ToString();
Ce qui est mieux? Savez-vous de meilleures façons de concaténer des chaînes de caractères?
Liés à ou peut-être dupliqué: stackoverflow.com/q/3102806/340760
Pourquoi ne pas tester les performances de vous-même?
Vous n'avez pas spécifié quels moyens les mieux. J'ai ajouté performance la balise à votre question.
Pourquoi ne pas tester les performances de vous-même?
Vous n'avez pas spécifié quels moyens les mieux. J'ai ajouté performance la balise à votre question.
OriginalL'auteur image | 2011-05-01
Vous devez vous connecter pour publier un commentaire.
Comme @Ekkehard dit, l'utilisation de la chaîne de caractères.Rejoindre.
Cependant, vous n'avez pas besoin de la
ToArray()
parce questring.Join
a une surcharge pourIEnumerable<string>
.MODIFIER
Comme @Kobi dit, cela fonctionnera seulement C# 4.0. En 3.5, je le ferais.
OriginalL'auteur Richard Schneider
Vous devez utiliser
string.Join()
parce que:un) c'est beaucoup plus lisible, plus facile à gérer et facile sur les yeux.
b) il utilise un
StringBuilder
en interne déjà, donc c'est très efficace ( vous pouvez vérifier vous-même en utilisant le Réflecteur).Edit:
string.Join()
utilise unStringBuilder
pour le cas général d'unIEnumerable<T>
d'entrée. Si vous disposez déjà d'un tableau sur l'autre main, elle utilise de la magie vaudou (y comprisFastAllocateString()
etUnSafeCharBuffer
) pour être encore plus rapide.string.Join(string, string[])
ne pas utiliserStringBuilder
, maisUnSafeCharBuffer
.Oui, tout était dans le processus d'édition qu'après cette observation ainsi - c'est vodoo magique, effectivement 😉
OriginalL'auteur BrokenGlass
Utilisation de la Rejoindre, car elle permet de ne pas ajouter un point ",".
OriginalL'auteur Ekkehard.Horner
Il y a une référence sur la cette page qui semble montrer que
string.Join
fonctionne mieux queStringBuilder
sur un petit tableau dans un grand nombre d'itérations. vous devriez probablement de référence pour des matrices plus grandes aussi. Comme je vais poster ce que je vois que BrokenGlass répondu queStringBuilder
est utilisé en interne dansstring.Join
de sorte que vous pouvez vous attendre à être plus rapide je pense.OriginalL'auteur Jan
Votre deuxième solution consiste à ajouter un supplément de
,
à la fin. Jetez un oeil à Eric Lippert entrée de blog deJe recommande la fixation de votre deuxième solution. Un StringBuilder serait certainement plus rapide, que vous évitez d'adaptation du contenu de la liste d'un nouveau tableau.
OriginalL'auteur Fede
StringBuilder est un moyen très efficace et serait recommandé ici.
string.Join()
peut être encore plus efficace (au moins dans le cas, lorsque vous lui donnerstring[]
, sinon utiliseStringBuilder
lui-même).svick vous avez donné un -1 pour quelqu'un qui dit quelque chose de plus intelligent que vous. Et cependant, le demandeur a besoin d'elle pour une liste de chaînes, pas pour un tableau.
comment est l'utilisation de
StringBuilder
de plus intelligent que de l'aidestring.Join()
? Le dernier est beaucoup plus claire, moins enclins à faire des erreurs (vous n'avez pas à écrire votre propre code) et peut-être plus rapidement.Mince, c'est juste une solution de rechange.
Pour utiliser des chaînes de caractères.rejoindre vous avez à prendre la liste et d'abord faire un tableau. Qui peut ne pas être le moyen le plus efficace, surtout si vous avez beaucoup de petites chaînes.
OriginalL'auteur Kevin Hsu
Selon le test que j'ai fait, Rejoindre est 3x plus rapide plus rapide sur de grands tableaux:
La
Text.txt
fichier contient la valeur"aaaaaaaaaaaaaaaaaaa"
sur 38400 lignes:De sortie:
OriginalL'auteur Shimmy
Chaîne de caractères.Rejoindre est la manière la plus rapide si vous avez un nombre fixe de chaînes à la rejoindre. La raison plus profonde est que la Chaîne de caractères.Jointure ne boucle sur le tableau et alloue de la finale de la mémoire tampon de chaîne avec la bonne taille, car il a la première passe, ajouter la longueur de la chaîne de toutes les cordes en même temps. Vous pouvez obtenir des résultats similaires lorsque vous jouez avec des StringBuilder et de sa capacité. La règle d'or est d'éviter les allocations de mémoire au prix de boucler sur le tableau à deux reprises. L'approche la plus rapide dépend du nombre d'articles que vous avez dans votre liste et comment big le resultint chaîne obtiendrez.
Vôtre,
Alois Kraus
OriginalL'auteur Alois Kraus
Code de Test:
Résultat 1.
String.Join
- 2.StringBuilder + SubString
.####ms (ticks)
Dans ce cas
String.Join
est plus rapide, mais si vous êtes ok avec un trailing,
puisStringBuilder
est légèrement plus rapide (avec un trailing,
).OriginalL'auteur BrunoLM
Cette ad hoc de la mise en œuvre, j'ai essayé avec le StrignBuilder est plus rapide que la Chaîne.Rejoignez.
Plus de cette Chaîne.Jointure est un dévoreur de MÉMOIRE.
J'ai essayé avec 20000000 des chaînes et des Cordes.Rejoignez donne toujours OutOfMemory, lors de ma mise en œuvre de finitions.
Sur votre machine, Il peut être encore moins de chaînes si vous avez moins de 8 go de mémoire.
Commentaire de l'une des implémentations de test.
Cela est vrai, sauf si vous utilisez une chaîne de caractères fixe tableau []. Chaîne de caractères.Rejoindre est bien.
OriginalL'auteur Marino Šimić
Si l'on veut être cool et exécuter sur de Fuel Lourd utiliser l'ensemble des
OriginalL'auteur ΩmegaMan