Cette réponse montre l'utilisation de LINQ ( Aggregate
) comme demandé dans la question et n'est pas destiné à un usage quotidien. Parce qu'il n'utilise pas de StringBuilder
il aura des performances horribles pendant de très longues séquences. Pour le code normal, utilisez String.Join
comme indiqué dans l'autre répondre
Utilisez des requêtes agrégées comme celles-ci :
string[] words = { "one", "two", "three" };
var res = words.Aggregate(
"", // start with empty string to handle empty list case.
(current, next) => current + ", " + next);
Console.WriteLine(res);
Cette sortie :
, one, two, three
Un agrégat est une fonction qui prend une collection de valeurs et renvoie une valeur scalaire. Les exemples de T-SQL incluent min, max et sum. VB et C# prennent tous deux en charge les agrégats. VB et C# prennent en charge les agrégats en tant que méthodes d'extension. En utilisant la notation par points, il suffit d'appeler une méthode sur un agrégat IEnumerable objet.
N'oubliez pas que les requêtes agrégées sont exécutées immédiatement.
Plus d'informations - MSDN : Requêtes agrégées
Si vous voulez vraiment utiliser Aggregate
variante d'utilisation utilisation StringBuilder
proposé en commentaire par CodeMonkeyKing ce qui correspondrait à peu près au même code qu'un String.Join
y compris de bonnes performances pour un grand nombre d'objets :
var res = words.Aggregate(
new StringBuilder(),
(current, next) => current.Append(current.Length == 0? "" : ", ").Append(next))
.ToString();
1 votes
Avez-vous découvert d'autres façons super cool de faire les choses avec LINQ ?
3 votes
La réponse sélectionnée et toutes les autres options ne fonctionnent pas avec Linq to Entities.
3 votes
@Binoj Antony, ne faites pas concaténer des chaînes de caractères dans votre base de données.
6 votes
@Pr0fess0rX : Parce qu'il ne peut pas et parce qu'il ne devrait pas. Je ne sais pas ce qu'il en est pour les autres bases de données, mais dans SQL Server, vous ne pouvez concaténer que (n)varcahr, ce qui vous limite à (n)varchar(max). Cela ne devrait pas être le cas car la logique d'entreprise ne devrait pas être implémentée dans la couche de données.
0 votes
Aucune des réponses ne fonctionne avec EntityFramework - voir le commentaire que j'ai placé sous la réponse marquée. Quelqu'un connaît-il une solution ?
0 votes
Si quelqu'un le fait à l'ancienne, vous pouvez remplacer sb.Remove(sb.Length - 2, 2) ; par sb.Length -= 2 ;