Liste C # <chaîne> à chaîne avec délimiteur

631

Existe-t-il une fonction en C # pour convertir rapidement une collection en chaîne et séparer les valeurs avec un délimiteur?

Par exemple:

List<string> names -> string names_together = "John, Anna, Monica"

nan
la source

Réponses:

1201

Vous pouvez utiliser String.Join. Si vous en avez un, List<string>vous pouvez d' ToArrayabord appeler :

List<string> names = new List<string>() { "John", "Anna", "Monica" };
var result = String.Join(", ", names.ToArray());

Dans .NET 4, vous n'en avez plus besoin ToArray, car il y a une surcharge String.Joinqui prend un IEnumerable<string>.

Résultats:


John, Anna, Monica

Quartermeister
la source
95

Vous pouvez également le faire avec linq si vous le souhaitez

var names = new List<string>() { "John", "Anna", "Monica" };
var joinedNames = names.Aggregate((a, b) => a + ", " + b);

Bien que je préfère la syntaxe non-linq dans la réponse de Quartermeister et je pense que cela Aggregatepourrait fonctionner plus lentement (probablement plus d'opérations de concaténation de chaînes).

Bob
la source
19
Merci pour les réponses rapides, les deux fonctionnent bien. Vous avez raison, j'ai fait une petite mesure de performance en utilisant la classe Stopwatch et la méthode linq est beaucoup plus lente: String.Join (",", names.ToArray ()); -> a pris 18 ticks Aggregate ((a, b) => a + "," + b) -> a pris 736 ticks
nan
2
Oui, je pense que Aggregatec'est mieux pour les opérations de type mathématique. Avec les chaînes, cette opération est similaire à for eaching et juste ajoutée à une chaîne qui est très lente et inefficace car vous créez une nouvelle chaîne pour chaque élément qui existe dans la liste.
Bob
Notez que l'agrégat sans valeur de départ lèvera une exception InvalidOperationException si le conteneur est vide. Utilisez la version prédéfinie Aggregate (seed, func) pour éviter le code de gestion des erreurs ou les vérifications conditionnelles. String.Join ne lance pas vide donc aucune graine ou code supplémentaire n'est requis ... en plus il ne nécessite pas Linq et la syntaxe est un peu plus claire.
Huacanacha
1
L'agrégat dans l'exemple ci-dessus peut fonctionner plus rapidement si vous utilisez StringBuilder. L'utilisation de «+» pour effectuer une concaténation multiple n'est pas recommandée. Voir la section Remarques ici ( msdn.microsoft.com/en-us/library/… )
Ilya Denisov