156 votes

Conversion d'une liste<int> en une chaîne séparée par des virgules

Existe-t-il un moyen de prendre une liste et de la convertir en chaîne de caractères séparée par des virgules ?

Je sais que je peux simplement faire une boucle et la construire, mais je pense que certains d'entre vous ont une façon plus cool de le faire ?

J'ai vraiment envie d'apprendre ces types de "trucs". Veuillez donc m'expliquer ou m'indiquer le lien vers les documents relatifs à la méthode que vous utilisez.

235voto

Pavel Minaev Points 60647
List<int> list = ...;
string.Join(",", list.Select(n => n.ToString()).ToArray())

7 votes

Astucieux mais lent et gonflé, car il alloue une chaîne par élément. L'utilisation d'un StringBuilder serait beaucoup plus efficace.

3 votes

D'après ce que j'ai vu en ligne (recherche rapide), String.Join est plus rapide que l'utilisation d'un StringBuilder.

4 votes

stackoverflow.com/questions/585860/ vous avez tort, Steven

165voto

Nitin Daware Points 133

La solution simple est

List<int> list = new List<int>() {1,2,3};
string.Join<int>(",", list)

Je viens de l'utiliser dans mon code, ça marche super bien.

1 votes

Merci ! C'est une belle approche

2 votes

C'est une meilleure approche que celle de la réponse acceptée. Avec cette approche, vous n'avez pas besoin d'importer Linq et c'est plus rapide.

0 votes

Cool ! Je ne savais pas que string.Join avait des surcharges génériques. Merci.

11voto

Yuriy Faktorovich Points 33347
List<int> list = new List<int> { 1, 2, 3 };
Console.WriteLine(String.Join(",", list.Select(i => i.ToString()).ToArray()));

0 votes

Idéal si vous ne pouvez pas utiliser .NET 4

6voto

Eric Lippert Points 300275

Pour environ un gazillion de solutions à une version légèrement plus compliquée de ce problème - dont beaucoup sont lentes, boguées, ou ne compilent même pas - voir les commentaires de mon article sur ce sujet :

https://docs.microsoft.com/en-us/archive/blogs/ericlippert/comma-quibbling

et le commentaire de StackOverflow :

Le défi d'Eric Lippert "comma-quibbling", meilleure réponse ?

0 votes

Merci pour le lien. Ce problème de concaténation de chaînes de caractères s'est avéré plus complexe, et plus éducatif, que je ne l'avais prévu !

0 votes

Je suppose que c'est vieux donc ça ne compte pas, mais ce n'est pas une réponse.

4voto

cdiggins Points 5549

Pour être encore plus cool, je ferais de cette méthode une extension de IEnumerable<T> pour qu'elle fonctionne sur n'importe quel IEnumerable :

public static class IEnumerableExtensions {
  public static string BuildString<T>(this IEnumerable<T> self, string delim = ",") {
    return string.Join(delim, self)        
  }
}

Utilisez-le comme suit :

List<int> list = new List<int> { 1, 2, 3 };
Console.WriteLine(list.BuildString(", "));

0 votes

Deux optimisations possibles : 1) Ajouter le délimiteur après chaque élément quoi qu'il en soit, puis supprimer l'excédent après la fin de la boucle. 2) Spécifier une capacité pour le StringBuilder.

1 votes

Si vous creusez Reflector, il s'avère que Join additionne les longueurs pour précalculer la taille du tampon, et aussi "amorce la pompe" en ajoutant la première chaîne en dehors de la boucle, et ensuite, à l'intérieur de la boucle, en ajoutant inconditionnellement le délimiteur avant la chaîne suivante. Combiné avec quelques astuces internes et non sécurisées, cela devrait être très rapide.

0 votes

@Steven : j'ai suivi votre conseil.

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