Existe-t-il une fonction en C# pour convertir rapidement une collection en chaîne et séparer les valeurs avec un délimiteur?C# List <string> Chaîne avec 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 et séparer les valeurs avec un délimiteur?C# List <string> Chaîne avec 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
premier:
List<string> names = new List<string>() { "John", "Anna", "Monica" };
var result = String.Join(", ", names.ToArray());
Dans .NET 4, vous n'avez pas besoin ToArray
plus, car il y a une surcharge de String.Join
qui prend un IEnumerable<string>
.
Vous pouvez aussi le faire avec LINQ si vous 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 je pense que Aggregate
pourrait effectuer plus lents (opérations probablement plus de concaténation de chaîne).
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
Pourquoi est-ce ici? Il n'a presque rien à voir avec l'OP ...? – Assimilater
Merci pour les réponses rapides, les deux fonctionnent bien. Tu as raison J'ai fait une petite mesure de performance en utilisant la classe Stopwatch et le linq-way est beaucoup plus lent: String.Join (",", names.ToArray()); -> a pris 18 ticks Agréger ((a, b) => a + "," + b) -> a pris 736 ticks – nan
Oui, je pense que 'Aggregate' est meilleur pour les opérations de type Math. Avec les chaînes, cette opération est similaire à '' pour chaque '' et est juste ajoutée à une chaîne qui est très lente parce que vous créez une nouvelle chaîne pour chaque élément existant dans la liste. – Bob
Notez que Agréger sans une valeur de départ lancera une exception InvalidOperationException si le conteneur est vide. Utilisez la version ensemencée Aggregate (seed, func) pour éviter le code de gestion des erreurs ou les contrôles conditionnels. String.Join ne jette pas sur vide donc aucune graine ou code supplémentaire n'est requis ... plus il ne nécessite pas Linq et la syntaxe est un peu plus claire. – Huacanacha