Concatena tutte le stringhe all'interno di un Elenco <stringa> utilizzando LINQ


543

Esiste una semplice espressione LINQ per concatenare i miei interi List<string>elementi della raccolta a un singolo stringcon un carattere delimitatore?

Cosa succede se la raccolta è di oggetti personalizzati anziché string? Immagina di dover concatenare object.Name.


37
Perché linq e non string.Join ()?
Alan,

14
string.Join è meglio ma penso che linq renda divertente il tuo codice, questo potrebbe essere il motivo!
Ali Ersöz,

14
String.Join è migliore perché utilizza StringBuilder ed evita le prestazioni intrinseche O (n ^ 2) della concatenazione ripetuta.
Kennet Belenky,

1
problemi di prestazioni con LINQ?
PreguntonCojoneroCabrón

Risposte:


525

Usando LINQ, questo dovrebbe funzionare;

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

descrizione della classe:

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

    }
}

Ed ecco il mio meglio :)

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

40
O (n ^ 2) il tempo colpisce ancora.
Kennet Belenky,

2
Se non riesci a vedere il metodo Aggregate, devi aggiungere usando System.Linq;
Cédric Guillemette,

6
Il problema è che sopra il metodo LinQ non funziona con un elenco vuoto o a singolo elemento.
Alexander,

2
genererà un InvalidOperationException nel caso in cui gli elementi siano vuoti.
2x Max

10
perché non usare solo string.join? Accetta la risposta di Sedat in modo che chiunque abbia fretta non scelga questa soluzione quando quella di Sedat è la scelta migliore.
Skychan,

966

In .NET 4.0 o versioni successive:

String.Join(delimiter, list);

è sufficiente.


91
Sono tutto per soluzioni LINQ ma questo è più efficiente di LINQ e del metodo Aggregate ().
andleer,

17
molto più pulito! ha funzionato alla grande per me! string.Join (",", accs.Select (x => x.AccountID) .ToArray ()),
m4tt1mus

32
@KonstantinSalavatov Avevo pubblicato la mia risposta prima che OP avesse chiarito che doveva essere in LINQ. È ancora perfettamente valido per chiunque si imbatta in questa risposta mentre cerca una soluzione "non necessariamente LINQ" su Google. Riguardo a questa risposta "non utile" in quel contesto è ingiusto.
Sedat Kapanoglu,

7
Questo può anche essere usato per cose diverse da List <String>e chiamerà il metodo ToString ().
Kian,

non funziona se si tratta di una query che va al database. Funziona solo sulla memoria.
alansiqueira27,

124

Questo è per un array di stringhe:

string.Join(delimiter, array);

Questo è per un elenco <stringa>:

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

E questo è per un elenco di oggetti personalizzati:

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

25
String.Join ha un sovraccarico che richiede un IEnumerable, quindi non è necessaria la chiamata ToArray ()
arolson101

9
Tieni presente che il sovraccarico IEnumerable esiste solo in 4.0 o versioni successive. Se si utilizza una versione precedente, sarà comunque necessario ToArray ().
Rakuen42,

2
Ah! L'ultimo sovraccarico era quello che stavo cercando. Sapevo che doveva esserci un modo per estrarre una proprietà specifica. :)
Mike Devenney,

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

26

Buona domanda. Sto usando

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

Non è LINQ, ma funziona.


Perché devi chiamare .ToArray ()?
Ε Г И І И О

Perché nei giorni difficili del 2009, string.Join non aveva un'estensione che accettasse un IEnumerable.
Jacob Proffitt,

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

7

Penso che se si definisce la logica in un metodo di estensione, il codice sarà molto più leggibile:

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

6

Puoi semplicemente usare:

List<string> items = new List<string>() { "foo", "boo", "john", "doe" };

Console.WriteLine(string.Join(",", items));

Buona programmazione!


3

Ho fatto questo usando LINQ:

var oCSP = (from P in db.Products select new { P.ProductName });

string joinedString = string.Join(",", oCSP.Select(p => p.ProductName));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.