Konzentrieren Sie alle Zeichenfolgen in einer Liste <Zeichenfolge> mit LINQ

543

Gibt es einen einfachen LINQ-Ausdruck, mit dem ich meine gesamten List<string>Sammlungselemente zu einem einzigen stringmit einem Trennzeichen verketten kann ?

Was ist, wenn die Sammlung aus benutzerdefinierten Objekten besteht string? Stellen Sie sich vor, ich muss verketten object.Name.

Jobi Joy
quelle
37
Warum linq und nicht string.Join ()?
Alan
14
string.Join ist besser, aber ich denke, mit linq macht dein Code Spaß, das könnte der Grund sein!
Ali Ersöz
14
String.Join ist besser, weil es einen StringBuilder verwendet und die inherrente O (n ^ 2) -Leistung wiederholter Verkettung vermeidet.
Kennet Belenky
1
Leistungsprobleme mit LINQ?
PreguntonCojoneroCabrón

Antworten:

525

Bei Verwendung von LINQ sollte dies funktionieren.

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

Klassenbeschreibung:

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

Verwendungszweck:

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

    }
}

Und hier ist mein Bestes :)

items.Select(i => i.Boo).Aggregate((i, j) => i + delimiter + j)
Ali Ersöz
quelle
40
O (n ^ 2) Zeit schlägt wieder zu.
Kennet Belenky
2
Wenn Sie die Aggregatmethode nicht sehen können, müssen Sie sie mit System.Linq hinzufügen.
Cédric Guillemette
6
Das Problem ist, dass die oben beschriebene LinQ-Methode nicht mit leeren Listen oder Listen mit einzelnen Elementen funktioniert.
Alexander
2
Es wird eine InvalidOperationException ausgelöst, falls Elemente leer sind.
2xMax
10
Warum nicht einfach string.join verwenden? Bitte akzeptieren Sie die Antwort von Sedat, damit sich niemand in Eile für diese Lösung entscheidet, wenn die von Sedat die bessere Wahl ist.
Skychan
966

In .NET 4.0 oder höheren Versionen:

String.Join(delimiter, list);

ist ausreichend.

Sedat Kapanoglu
quelle
91
Ich bin alles für LINQ-Lösungen, aber dies ist effizienter als LINQ und die Aggregate () -Methode.
andleer
17
viel sauberer! hat super für mich funktioniert! string.Join (",", accs.Select (x => x.AccountID) .ToArray ()),
m4tt1mus
32
@KonstantinSalavatov Ich hatte meine Antwort gepostet, bevor OP klargestellt hatte, dass es in LINQ sein musste. Es ist immer noch vollkommen gültig für alle, die auf diese Antwort stoßen, während sie bei Google nach einer "nicht unbedingt LINQ" -Lösung suchen. In Bezug auf diese Antwort ist "nicht nützlich" in diesem Zusammenhang unfair.
Sedat Kapanoglu
7
Dies kann auch für andere <String>Zwecke als List s verwendet werden und ruft die ToString () -Methode auf.
Kian
funktioniert nicht, wenn dies eine Abfrage ist, die an die Datenbank geht. Es funktioniert nur im Speicher.
Alansiqueira27
124

Dies ist für ein String-Array:

string.Join(delimiter, array);

Dies ist für eine Liste <string>:

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

Und dies ist für eine Liste von benutzerdefinierten Objekten:

string.Join(delimiter, list.Select(i => i.Boo).ToArray());
Alexander Prokofyev
quelle
25
String.Join hat eine Überladung, die eine IEnumerable benötigt, so dass Sie den ToArray ()
-Aufruf
9
Beachten Sie, dass die IEnumerable-Überlastung nur in 4.0 oder höher vorhanden ist. Wenn Sie eine ältere Version verwenden, benötigen Sie weiterhin ToArray ().
Rakuen42
2
Ah! Diese letzte Überlastung war die, nach der ich gesucht habe. Ich wusste, dass es einen Weg geben musste, eine bestimmte Eigenschaft zu extrahieren. :)
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));
dev.bv.
quelle
26

Gute Frage. Ich habe benutzt

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

Es ist nicht LINQ, aber es funktioniert.

Jacob Proffitt
quelle
Warum müssen Sie .ToArray () aufrufen?
Г :5 І І О
Denn in den schlechten alten Tagen des Jahres 2009 hatte string.Join keine Erweiterung, die eine IEnumerable akzeptierte.
Jacob Proffitt
8
List<string> strings = new List<string>() { "ABC", "DEF", "GHI" };
string s = strings.Aggregate((a, b) => a + ',' + b);
Peter McG
quelle
7

Ich denke, wenn Sie die Logik in einer Erweiterungsmethode definieren, ist der Code viel besser lesbar:

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(", ");
Jordão
quelle
6

Sie können einfach verwenden:

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

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

Viel Spaß beim Codieren!

Nishanth Shaan
quelle
3

Ich habe dies mit LINQ gemacht:

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

string joinedString = string.Join(",", oCSP.Select(p => p.ProductName));
Biddut
quelle