ou IEnumerable '/> ou IEnumerable '/> ou IEnumerable '/> Création d'une liste séparée par des virgules à partir de IList <string> ou IEnumerable <string> | abulletproofidea.com

Question Création d'une liste séparée par des virgules à partir de IList ou IEnumerable


Quel est le moyen le plus propre de créer une liste de valeurs de chaînes séparées par des virgules IList<string> ou IEnumerable<string>?

String.Join(...) fonctionne sur un string[] peut donc être lourd à travailler avec des types tels que IList<string> ou IEnumerable<string> ne peut pas facilement être converti en un tableau de chaînes.


688
2018-04-28 19:15


origine


Réponses:


.NET 4+

IList<string> strings = new List<string>{"1","2","testing"};
string joined = string.Join(",", strings);

Détail & Pre .Net 4.0 Solutions

IEnumerable<string> peut être converti en un tableau de chaînes très facilement avec LINQ (.NET 3.5):

IEnumerable<string> strings = ...;
string[] array = strings.ToArray();

Il est assez facile d'écrire la méthode d'aide équivalente si vous avez besoin de:

public static T[] ToArray(IEnumerable<T> source)
{
    return new List<T>(source).ToArray();
}

Puis appelez comme ceci:

IEnumerable<string> strings = ...;
string[] array = Helpers.ToArray(strings);

Vous pouvez ensuite appeler string.Join. Bien sûr, vous ne le faites pas avoir utiliser une méthode d'assistance:

// C# 3 and .NET 3.5 way:
string joined = string.Join(",", strings.ToArray());
// C# 2 and .NET 2.0 way:
string joined = string.Join(",", new List<string>(strings).ToArray());

Ce dernier est un peu une bouchée cependant :)

C'est probablement le moyen le plus simple de le faire, et très performant aussi - il y a d'autres questions sur la performance, y compris (mais pas seulement) celui-là.

À partir de .NET 4.0, il y a plus de surcharges disponibles dans string.Join, donc vous pouvez écrire:

string joined = string.Join(",", strings);

Beaucoup plus simple :)


1173
2018-04-28 19:17



FYI, la version .NET 4.0 de string.Join() a quelques surcharges supplémentaires, ça marche avec IEnumerable au lieu de seulement des tableaux, y compris un qui peut traiter avec n'importe quel type T:

public static string Join(string separator, IEnumerable<string> values)
public static string Join<T>(string separator, IEnumerable<T> values)

171
2018-06-18 02:37



La façon la plus simple que je peux voir pour faire cela est d'utiliser le LINQ Aggregate méthode:

string commaSeparatedList = input.Aggregate((a, x) => a + ", " + x)

57
2018-04-28 19:18



Je pense que la façon la plus simple de créer une liste de valeurs de chaînes séparées par des virgules est simplement:

string.Join<string>(",", stringEnumerable);

Voici un exemple complet:

IEnumerable<string> stringEnumerable= new List<string>();
stringList.Add("Comma");
stringList.Add("Separated");

string.Join<string>(",", stringEnumerable);

Il n'y a pas besoin de faire une fonction d'aide, ceci est construit dans .NET 4.0 et au-dessus.


29
2017-08-05 19:52



Voici une autre méthode d'extension:

    public static string Join(this IEnumerable<string> source, string separator)
    {
        return string.Join(separator, source);
    }

8
2018-06-18 13:38



Puisque je suis arrivé ici en cherchant à rejoindre sur une propriété spécifique d'une liste d'objets (et non le ToString ()) voici un ajout à la réponse acceptée:

var commaDelimited = string.Join(",", students.Where(i => i.Category == studentCategory)
                                 .Select(i => i.FirstName));

8
2017-08-20 06:34



En arrivant un peu en retard à cette discussion mais c'est ma contribution fwiw. j'ai un IList<Guid> OrderIds être converti en une chaîne CSV mais le suivant est générique et fonctionne non modifié avec d'autres types:

string csv = OrderIds.Aggregate(new StringBuilder(),
             (sb, v) => sb.Append(v).Append(","),
             sb => {if (0 < sb.Length) sb.Length--; return sb.ToString();});

Court et doux, utilise StringBuilder pour construire une nouvelle chaîne, réduit StringBuilder d'une unité pour supprimer la dernière virgule et renvoie une chaîne CSV.

J'ai mis à jour ceci pour utiliser plusieurs Append()est d'ajouter une chaîne + une virgule. De la rétroaction de James, j'ai utilisé Reflector pour jeter un coup d'œil à StringBuilder.AppendFormat(). Il s'avère que AppendFormat() utilise un StringBuilder pour construire la chaîne de format qui le rend moins efficace dans ce contexte que d'utiliser plusieurs Appends()'s.


7
2018-06-18 02:31