2009-02-18 11 views
413

¿Hay alguna expresión LINQ fácil para concatenar todos mis elementos de colección List<string> en un único string con un carácter delimitador?Concat todas las cadenas dentro de una lista <string> usando LINQ

¿Qué sucede si la colección es de objetos personalizados en lugar de string? Imagina que necesito concatenar en object.Name.

+25

¿Por qué linq y no string.Join()? – Alan

+13

string.Join es mejor, pero creo que linq hace que tu código sea divertido, ¡esa podría ser la razón! –

+10

String.Join es mejor porque usa un StringBuilder y evita el rendimiento O (n^2) heredado de la concatenación repetida. –

Respuesta

409

Al usar LINQ, esto debería funcionar; Descripción

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

clase:

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

Uso:

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(); 

    } 
} 

Y aquí es mi mejor :)

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

O (n^2) el tiempo vuelve a golpear. –

+2

Si no puede ver el método Agregado, debe agregar usando System.Linq; –

+0

mejor utilizando String.Formato como elementos.Seleccione (i => i.Boo) .Agregado ((i, j) => cadena.Formato ("{0} {1} {2}", i, delimitador, j)) –

690

En .NET 4.0 y posterior:

String.Join(delimiter, list); 

es suficiente. Para versiones anteriores, debe:

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

Estoy a favor de las soluciones LINQ, pero esto es más eficiente que LINQ y el método Aggregate(). – andleer

+12

mucho más limpio! funcionó muy bien para mí! string.Join (",", accs.Select (x => x.AccountID) .ToArray()), – m4tt1mus

+2

no Linq y obvio –

22

Buena pregunta. He estado usando

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

No es LINQ, pero funciona.

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

Se trata de una matriz de cadenas:

string.Join(delimiter, array); 

Esta es una lista de <cadena>:

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

Y esta es una lista de objetos personalizados:

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

String.Join tiene una sobrecarga que toma un IEnumerable, por lo que no necesita la llamada ToArray() – arolson101

+5

Tenga en cuenta que la sobrecarga de IEnumerable solo existe en 4.0 o posterior. Si estás usando una versión anterior, necesitarás ToArray(). – Rakuen42

+0

¡Ah! Esa última sobrecarga fue la que estaba buscando. Sabía que tenía que haber una forma de extraer una propiedad específica. :) –

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

Creo que si se define la lógica de un método de extensión el código será mucho más legible:

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(", "); 
Cuestiones relacionadas