2009-02-18 9 views
413

Existe-t-il une expression LINQ facile pour concaténer tous mes éléments de collection List<string> en un seul string avec un caractère délimiteur?Concat toutes les chaînes à l'intérieur d'une liste <string> en utilisant LINQ

Que faire si la collection est d'objets personnalisés au lieu de string? Imaginez que je dois concaténer sur object.Name.

+25

Pourquoi linq et pas string.Join()? – Alan

+13

string.Join est meilleur mais je pense que linq rend votre code amusant, cela pourrait être le pourquoi! –

+10

String.Join est meilleur car il utilise un StringBuilder et évite les performances O (n^2) d'une concaténation répétée. –

Répondre

409

En utilisant LINQ, cela devrait fonctionner;

string delimiter = ","; 
List<string> items = new List<string>() { "foo", "boo", "john", "doe" }; 
Console.WriteLine(items.Aggregate((i, j) => i + delimiter + j)); 

Description de la classe:

public class Foo 
{ 
    public string Boo { get; set; } 
} 

Utilisation:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string delimiter = ","; 
     List<Foo> items = new List<Foo>() { new Foo { Boo = "ABC" }, new Foo { Boo = "DEF" }, 
      new Foo { Boo = "GHI" }, new Foo { Boo = "JKL" } }; 

     Console.WriteLine(items.Aggregate((i, j) => new Foo{Boo = (i.Boo + delimiter + j.Boo)}).Boo); 
     Console.ReadKey(); 

    } 
} 

Et voici mon meilleur :)

items.Select(i => i.Boo).Aggregate((i, j) => i + delimiter + j) 
+27

O (n^2) le temps frappe à nouveau. –

+2

Si vous ne pouvez pas voir la méthode Aggregate, vous devez ajouter using System.Linq; –

+0

mieux en utilisant String.Format comme éléments.Sélectionnez (i => i.Boo) .Aggregate ((i, j) => chaîne.Format ("{0} {1} {2}", i, délimiteur, j) –

690

Dans .NET 4.0 et versions ultérieures:

String.Join(delimiter, list); 

est suffisante. Pour les anciennes versions, vous devez:

String.Join(delimiter, list.ToArray()); 
+72

Je suis tout pour les solutions LINQ mais c'est plus efficace que LINQ et la méthode Aggregate(). – andleer

+12

beaucoup plus propre! travaillé très bien pour moi! string.Join (",", accs.Select (x => x.AccountID) .ToArray()), – m4tt1mus

+2

pas Linq et évident –

22

Bonne question. J'ai utilisé

List<string> myStrings = new List<string>{ "ours", "mine", "yours"}; 
string joinedString = string.Join(", ", myStrings.ToArray()); 

Ce n'est pas LINQ, mais cela fonctionne.

7
List<string> strings = new List<string>() { "ABC", "DEF", "GHI" }; 
string s = strings.Aggregate((a, b) => a + ',' + b); 
99

Ceci est un tableau de chaînes:

string.Join(delimiter, array); 

Ceci est pour une liste < chaîne >:

string.Join(delimiter, list.ToArray()); 

Et ceci est une liste des objets personnalisés:

string.Join(delimiter, list.Select(i => i.Boo).ToArray()); 
+19

String.Join a une surcharge qui prend un IEnumerable, donc vous n'avez pas besoin de l'appel ToArray() – arolson101

+5

Gardez à l'esprit que la surcharge IEnumerable n'existe que dans la version 4.0 ou ultérieure. Si vous utilisez une version plus ancienne, vous aurez toujours besoin de ToArray(). – Rakuen42

+0

Ah! Cette dernière surcharge était celle que je cherchais. Je savais qu'il devait y avoir un moyen d'extraire une propriété spécifique. :) –

46
using System.Linq; 

public class Person 
{ 
    string FirstName { get; set; } 
    string LastName { get; set; } 
} 

List<Person> persons = new List<Person>(); 

string listOfPersons = string.Join(",", persons.Select(p => p.FirstName)); 
4

Je pense que si vous définissez la logique une méthode d'extension le code sera beaucoup plus lisible:

public static class EnumerableExtensions { 
    public static string Join<T>(this IEnumerable<T> self, string separator) { 
    return String.Join(separator, self.Select(e => e.ToString()).ToArray()); 
    } 
} 

public class Person { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public override string ToString() { 
    return string.Format("{0} {1}", FirstName, LastName); 
    } 
} 

// ... 

List<Person> people = new List<Person>(); 
// ... 
string fullNames = people.Join(", "); 
string lastNames = people.Select(p => p.LastName).Join(", "); 
Questions connexes