9
votes

Générer des valeurs séparées par des virgules

Supposons que j'ai une collection de chaînes: xxx pré>

et je voudrais générer des valeurs séparées par des virgules de la liste en quelque chose comme: P>

if (strs.Count() > 0)
{
  var sb = new StringBuilder();
  foreach (var str in strs)
    sb.AppendFormat("{0}, ", str);
  return sb.Remove(0, 2).ToString();
}
  • Utilisez la boucle et la chaîne.format () ou StringBuilder. LI>
  • Utilisez un compteur entier et supprimez la fin "," si la valeur> 0 li>
  • ne mettez pas "", "sur la première course li>
  • etc. li> ul>

    échantillon code de ce que j'ai maintenant: p> xxx pré>

    Quel est le meilleur code qui est hautement réutilisable pour le scénario ci-dessus et pourquoi? p> p>


0 commentaires

7 Réponses :


26
votes

Vous voulez utiliser le string.join code> méthode, qui existe dans la BCL à cette fin.

Exemple: p> xxx pré>

ou si vous utilisez .NET 3.5, vous pouvez le faire avec. tout ienumerable code> comme tel: p> xxx pré>

(Notez que cela ne donne pas la meilleure performance car elle nécessite, bien qu'il soit clairement toujours possible 'O (n)', et devrait convenir à presque tous les cas). P>

MAINTENANT, si votre énumérable n'est pas de type chaîne code> (générique un ienumerable code>), vous pouvez simplement utiliser la méthode SELECT CODE> pour convertir le résultat dans une chaîne, par exemple P>

var output = string.Join(", ", items.Select(x => x.Contains(",") ?
    "\"" + x.Replace("\"", "\"\"") + "\"" : x);


8 commentaires

Hmm ... je ne savais pas que cette fonction existe (rend ma question malade).


@Adrian: Pas de soucis. Si vous n'êtes pas issu d'un antécédent .NET, la découverte de nouvelles choses dans le cadre n'est pas toujours simple - c'est un processus surgointe de construction de familiarité.


C'est le problème, je faisais .net depuis la première version. Duh.


Heh, eh bien, nous apprenons toujours de nouvelles fonctionnalités de la BCL. Je pense que le fait que votre question ait été votée montre que ce n'était pas une question stupide. :)


Vous voudrez faire attention ici. Si l'une des chaînes contient une virgule, elle lancera le CSV.


@ YODAJ007: En effet, il devra utiliser une méthode légèrement plus compliquée pour cela, et la fractionnement devrait être effectuée à l'aide d'une regex ou d'une telle. Ce n'est pas spécifié dans la question cependant, je ne suis donc pas sûr que si c'est nécessaire.


@Noldorin non, ça ne sera pas nécessaire. La version 1 de votre réponse est assez bonne.


@Adrian: Je le soupçonnai donc. C'est là quand même cependant, au cas où cela pourrait aider les autres. :)



2
votes

Utilisez

string s = string.Join (",", new string[] {"aaa", "bbb", "ccc"});


0 commentaires

0
votes

Utilisez String.join


0 commentaires

3
votes
string finalstr = String.Join(",", strs);

0 commentaires

0
votes

Si vous avez un tableau de chaînes, allez avec Noldorin Solution.

Mais si c'est un autre type de collection, je pourrais faire ceci: xxx


0 commentaires

4
votes

Comme d'autres personnes ont dit: string.join code> est normalement em> le meilleur moyen de le faire. Mais que se passe-t-il si vous venez d'avoir un iénumérable plutôt qu'un tableau? Vous avez peut-être un code pour énumérer ceux-ci comme vous les lisez d'un fichier à l'aide d'une exécution différée. Dans ce cas String.join n'est pas tout aussi agréable, car vous devez faire boucle deux fois sur les cordes - une fois pour créer la matrice et une fois pour la rejoindre. Dans ce cas, vous voulez quelque chose de plus comme ceci:

string finalStr = MyStrings.ToDelimitedString(",");


3 commentaires

Oui, c'est apparemment le scénario le plus courant. IEnumerable que string [].


+1 Le "résultat.append (d) .append (s) 'est intéressant ... jamais même penser à cela. Ce serait un peu propre de voir combien de façons différentes cette tâche simple est en cours.


La chose vraiment cool est que la gigue optimisera normalement les missions supplémentaires. Le code fait donc exactement ce que vous voulez i.



4
votes

string.join est la bonne réponse, mais dans le cas d'un iénumérable, Linq est souvent plus court qu'une boucle:

someStringCollection.Aggregate((first, second) => first + ", " + second);


0 commentaires