763 votes

C# Liste<string> vers chaîne de caractères avec délimiteur

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

Par exemple :

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

1463voto

Quartermeister Points 24729

Vous pouvez utiliser String.Join . Si vous avez un List<string> alors vous pouvez appeler ToArray d'abord :

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

En .NET 4, vous n'avez pas besoin de l'option ToArray plus, puisqu'il y a une surcharge de String.Join qui prend un IEnumerable<string> .

Résultats :


John, Anna, Monica

116voto

Bob Points 34449

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 que je pense que Aggregate pourrait être plus lent (probablement plus d'opérations de concaténation de chaînes).

27 votes

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

2 votes

Oui, je pense Aggregate est préférable pour les opérations de type mathématique. Avec les chaînes de caractères, cette opération est similaire à for each et simplement ajouter à une chaîne de caractères, ce qui est très lent et inefficace car vous créez une nouvelle chaîne de caractères pour chaque élément existant dans la liste.

0 votes

Notez que l'agrégat sans valeur d'amorçage déclenchera une InvalidOperationException si le conteneur est vide. Utilisez la version seedée Aggregate(seed, func) pour éviter le code de gestion des erreurs ou les vérifications conditionnelles. String.Join ne lève pas l'exception si le conteneur est vide, donc pas besoin de seed ou de code supplémentaire... de plus, il ne nécessite pas Linq et la syntaxe est un peu plus claire.

-12voto

superlogical Points 5129
List<string> targets = new List<string>();

var InboxChecked = true;
var BannerChecked = false;
var EmailChecked = true;

if (InboxChecked)
{
    targets.Add("Inbox");
}

if (BannerChecked)
{
    targets.Add("Banner");
}

if (EmailChecked)
{
    targets.Add("Email");
}

var index = 0;

if (targets.Any())
{
    var aggregate = targets.Aggregate((s1, s2) =>
    {
        return ++index == targets.Count - 1 ? s1 + " and " + s2 : s1 + ", " + s2;
    });

    // aggregate.Dump();
}

// returns -> Inbox and Email

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