Quelle est la façon la plus simple de créer une liste de valeurs de chaîne séparées par des virgules à partir d'un IList<string>
ou IEnumerable<string>
?
String.Join(...)
fonctionne sur un string[]
donc peut être fastidieux de travailler avec lorsque des types tels que IList<string>
ou IEnumerable<string>
ne peuvent pas facilement être convertis en un tableau de chaînes.
public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)
Réponses:
.NET 4+
Détails et solutions pré-Net 4.0
IEnumerable<string>
peut être converti en un tableau de chaînes très facilement avec LINQ (.NET 3.5):Il est assez facile d'écrire la méthode d'assistance équivalente si vous devez:
Ensuite, appelez-le comme ceci:
Vous pouvez ensuite appeler
string.Join
. Bien sûr, vous n'avez pas besoin d'utiliser une méthode d'assistance:Ce dernier est un peu bouchée cependant :)
C'est probablement le moyen le plus simple de le faire, et assez performant également - il y a d'autres questions sur la nature exacte des performances, y compris (mais sans s'y limiter) celle-ci .
Depuis .NET 4.0, il y a plus de surcharges disponibles dans
string.Join
, vous pouvez donc simplement écrire:Beaucoup plus simple :)
la source
List<T>
fait. Pourquoi réinventer la roue?ToList
. C'est bien d'utiliserstring myStr = string.Join(",", foo.Select(a => a.someInt.ToString()))
cependant.Pour info, la version .NET 4.0 de
string.Join()
comporte des surcharges supplémentaires , qui fonctionnent avecIEnumerable
au lieu de simples tableaux, dont un qui peut gérer n'importe quel typeT
:la source
str = emps.Select(e => e.SSN).Join(",")
La façon la plus simple que je peux voir pour ce faire est d'utiliser la
Aggregate
méthode LINQ :la source
Func<StringBuilder,string,StringBuider>
. Ensuite, appelez simplementToString()
le StringBuilder retourné. Bien sûr, ce n'est pas aussi joli :)input.Count
devrait être plus de 1.Je pense que la façon la plus propre de créer une liste de valeurs de chaînes séparées par des virgules est simplement:
Voici un exemple complet:
Il n'est pas nécessaire de créer une fonction d'assistance, elle est intégrée à .NET 4.0 et supérieur.
la source
En comparant les performances, le gagnant est "Bouclez-le, ajoutez-le et faites un pas en arrière". En fait, "enumerable and manual move next" est le même bien (pensez à stddev).
Code:
https://github.com/dotnet/BenchmarkDotNet a été utilisé
la source
Depuis que je suis arrivé ici en cherchant à joindre une propriété spécifique d'une liste d'objets (et non le ToString () de celui-ci), voici un ajout à la réponse acceptée:
la source
Voici une autre méthode d'extension:
la source
J'arrive un peu tard pour cette discussion mais c'est ma contribution fwiw. J'ai un
IList<Guid> OrderIds
à convertir en une chaîne CSV mais ce qui suit est générique et fonctionne sans modification avec d'autres types:Court et doux, utilise StringBuilder pour construire une nouvelle chaîne, réduit la longueur de StringBuilder d'une unité pour supprimer la dernière virgule et renvoie la chaîne CSV.
J'ai mis à jour ceci pour utiliser plusieurs
Append()
pour ajouter chaîne + virgule. D'après les commentaires de James, j'ai utilisé Reflector pour jeter un coup d'œilStringBuilder.AppendFormat()
. Il s'avère qu'ilAppendFormat()
utilise un StringBuilder pour construire la chaîne de formatage, ce qui la rend moins efficace dans ce contexte que la simple utilisation de plusieursAppends()
.la source
Quelque chose d'un peu énormément, mais cela fonctionne:
Vous donne un CSV à partir d'une liste après lui avoir donné le convertisseur (dans ce cas, d => d.DivisionID.ToString ("b")).
Hacky mais fonctionne - pourrait peut-être devenir une méthode d'extension?
la source
Voici comment je l'ai fait, en utilisant la façon dont je l'ai fait dans d'autres langues:
la source
Besoin spécifique quand il faut s'entourer de ', par ex:
la source
Nous avons une fonction utilitaire, quelque chose comme ceci:
Qui peut être utilisé pour rejoindre facilement de nombreuses collections:
Notez que nous avons le paramètre de collection avant le lambda car intellisense récupère alors le type de collection.
Si vous avez déjà une énumération de chaînes, tout ce que vous devez faire est le ToArray:
la source
vous pouvez convertir IList en un tableau à l'aide de ToArray, puis exécuter une commande string.join sur le tableau.
la source
Ils peuvent être facilement convertis en tableau à l'aide des extensions Linq dans .NET 3.5.
la source
Vous pouvez également utiliser quelque chose comme ce qui suit après l'avoir converti en tableau à l'aide de l'une des méthodes répertoriées par d'autres:
Edit: Voici un autre exemple
la source
Je viens de résoudre ce problème avant de passer à travers cet article. Ma solution va quelque chose comme ci-dessous:
Appelé comme:
J'aurais pu tout aussi bien m'exprimer comme tel et j'aurais aussi été plus efficace:
la source
Ma réponse est similaire à la solution d'agrégation ci-dessus, mais devrait être moins lourde en termes de pile d'appels car il n'y a pas d'appels délégués explicites:
Bien sûr, on peut étendre la signature pour qu'elle soit indépendante du délimiteur. Je ne suis vraiment pas un fan de l'appel sb.Remove () et je voudrais le refactoriser pour qu'il soit une boucle en ligne droite sur un IEnumerable et utiliser MoveNext () pour déterminer s'il faut ou non écrire une virgule. Je vais tripoter et publier cette solution si j'y tombe dessus.
Voici ce que je voulais au départ:
Aucun stockage temporaire de tableau ou de liste requis et aucun
StringBuilder
Remove()
ouLength--
piratage requis.Dans ma bibliothèque de framework, j'ai fait quelques variations sur cette signature de méthode, chaque combinaison d'inclure
delimiter
lesconverter
paramètres et avec l'utilisation de","
etx.ToString()
par défaut, respectivement.la source
J'espère que c'est le moyen le plus simple
la source
Je suis tombé sur cette discussion en recherchant une bonne méthode C # pour joindre des chaînes comme cela se fait avec la méthode MySql
CONCAT_WS()
. Cette méthode diffère de lastring.Join()
méthode en ce qu'elle n'ajoute pas le signe séparateur si les chaînes sont NULL ou vides.ne retournera que
Lastname
si le prénom est vide, tandis quereviendra
strLastname + ", "
dans le même cas.Voulant le premier comportement, j'ai écrit les méthodes suivantes:
la source
J'ai écrit quelques méthodes d'extension pour le faire d'une manière efficace:
Cela dépend de
la source
Vous pouvez utiliser
.ToArray()
surLists
etIEnumerables
, puis utiliserString.Join()
comme vous le souhaitez.la source
Si les chaînes que vous souhaitez joindre se trouvent dans la liste d'objets, vous pouvez également faire quelque chose comme ceci:
la source