Existe-t-il une fonction en C# pour convertir rapidement une collection en chaîne de caractères et séparer les valeurs avec un délimiteur ?
Par exemple :
List<string> names
--> string names_together = "John, Anna, Monica"
Existe-t-il une fonction en C# pour convertir rapidement une collection en chaîne de caractères et séparer les valeurs avec un délimiteur ?
Par exemple :
List<string> names
--> string names_together = "John, Anna, Monica"
Vous pouvez utiliser String.Join
. Si vous avez un List<string>
alors vous pouvez appeler ToArray
d'abord :
List<string> names = new List<string>() { "John", "Anna", "Monica" };
var result = String.Join(", ", names.ToArray());
En .NET 4, vous n'avez pas besoin de l'option ToArray
plus, puisqu'il y a une surcharge de String.Join
qui prend un IEnumerable<string>
.
Résultats :
John, Anna, Monica
Vous pouvez également le faire avec linq si vous le souhaitez.
var names = new List<string>() { "John", "Anna", "Monica" };
var joinedNames = names.Aggregate((a, b) => a + ", " + b);
Bien que je préfère la syntaxe non-linq dans la réponse de Quartermeister et que je pense que Aggregate
pourrait être plus lent (probablement plus d'opérations de concaténation de chaînes).
Merci pour les réponses rapides, les deux fonctionnent bien. Vous avez raison, j'ai fait une petite mesure de performance en utilisant la classe Stopwatch et la méthode linq est beaucoup plus lente : String.Join(", ", names.ToArray()) ; --> a pris 18 ticks Aggregate((a, b) => a + ", " + b) --> a pris 736 ticks
Oui, je pense Aggregate
est préférable pour les opérations de type mathématique. Avec les chaînes de caractères, cette opération est similaire à for each
et simplement ajouter à une chaîne de caractères, ce qui est très lent et inefficace car vous créez une nouvelle chaîne de caractères pour chaque élément existant dans la liste.
Notez que l'agrégat sans valeur d'amorçage déclenchera une InvalidOperationException si le conteneur est vide. Utilisez la version seedée Aggregate(seed, func) pour éviter le code de gestion des erreurs ou les vérifications conditionnelles. String.Join ne lève pas l'exception si le conteneur est vide, donc pas besoin de seed ou de code supplémentaire... de plus, il ne nécessite pas Linq et la syntaxe est un peu plus claire.
List<string> targets = new List<string>();
var InboxChecked = true;
var BannerChecked = false;
var EmailChecked = true;
if (InboxChecked)
{
targets.Add("Inbox");
}
if (BannerChecked)
{
targets.Add("Banner");
}
if (EmailChecked)
{
targets.Add("Email");
}
var index = 0;
if (targets.Any())
{
var aggregate = targets.Aggregate((s1, s2) =>
{
return ++index == targets.Count - 1 ? s1 + " and " + s2 : s1 + ", " + s2;
});
// aggregate.Dump();
}
// returns -> Inbox and Email
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.