Supposons que j'ai une collection de chaînes: et je voudrais générer des valeurs séparées par des virgules de la liste en quelque chose comme: P> échantillon code de ce que j'ai maintenant: p> Quel est le meilleur code qui est hautement réutilisable pour le scénario ci-dessus et pourquoi? p> p>if (strs.Count() > 0)
{
var sb = new StringBuilder();
foreach (var str in strs)
sb.AppendFormat("{0}, ", str);
return sb.Remove(0, 2).ToString();
}
7 Réponses :
Vous voulez utiliser le string.join code> méthode, qui existe dans la BCL à cette fin.
Exemple: p> ou si vous utilisez .NET 3.5, vous pouvez le faire avec. tout (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 ienumerable chaîne code> (générique un ienumerable 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);
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. :)
Utilisez
string s = string.Join (",", new string[] {"aaa", "bbb", "ccc"});
string finalstr = String.Join(",", strs);
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: p>
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(",");
Oui, c'est apparemment le scénario le plus courant. IEnumerable
+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 i> ce que vous voulez i.
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);