684 Stimmen

Concateniere alle Zeichenfolgen in einer List<string> mithilfe von LINQ

Gibt es einen einfachen LINQ-Ausdruck, um alle Elemente meiner gesamten List-Sammlung zu einem einzelnen string mit einem Trennzeichen zu verkettet?

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

45 Stimmen

Warum Linq und nicht string.Join() ?

17 Stimmen

String.Join ist besser, aber ich denke, dass Linq deinen Code Spaß macht, das könnte der Grund sein!

22 Stimmen

String.Join ist besser, weil es einen StringBuilder verwendet und die inhärente O(n^2)-Leistung der wiederholten Verkettung vermeidet.

1251voto

Sedat Kapanoglu Punkte 44545
string ergebnis = String.Join(trennzeichen, liste);

ist ausreichend.

104 Stimmen

Ich bin absolut für LINQ-Lösungen, aber dies ist effizienter als LINQ und die Aggregate()-Methode.

23 Stimmen

Viel sauberer! Hat bei mir super funktioniert! string.Join(", ", accs.Select(x => x.AccountID).ToArray()),

36 Stimmen

@KonstantinSalavatov Ich hatte meine Antwort gepostet, bevor der Fragesteller klargestellt hatte, dass sie in LINQ sein musste. Es ist immer noch vollkommen gültig für jeden, der auf diese Antwort stößt, während er nach einer "nicht unbedingt-LINQ"-Lösung auf Google sucht. Es ist unfair, diese Antwort in diesem Kontext als "nicht nützlich" zu betrachten.

563voto

Ali Ersöz Punkte 15342

Warnung - ernsthafte Leistungsprobleme

Obwohl diese Antwort das gewünschte Ergebnis liefert, leidet sie im Vergleich zu anderen Antworten hier unter schlechter Leistung. Seien Sie sehr vorsichtig bei der Entscheidung, sie zu verwenden


Mit LINQ sollte dies funktionieren;

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

Klassenbeschreibung:

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

Verwendung:

class Program
{
    static void Main(string[] args)
    {
        string delimiter = ",";
        List items = new List() { 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)

50 Stimmen

O(n^2) Zeit schlägt wieder zu.

2 Stimmen

Wenn Sie die Aggregate-Methode nicht sehen können, müssen Sie using System.Linq; hinzufügen.

0 Stimmen

Es ist besser, String.Format zu verwenden, z. B. items.Select(i => i.Boo).Aggregate((i, j) => string.Format("{0} {1} {2}", i, delimiter, j))

152voto

Alexander Prokofyev Punkte 32808

Hinweis: Diese Antwort verwendet nicht LINQ, um den verketteten String zu generieren. Die Verwendung von LINQ, um Enumerables in delimierte Strings umzuwandeln, kann ernsthafte Leistungsprobleme verursachen

Modernes .NET (seit .NET 4)

Dies gilt für ein Array, eine Liste oder einen beliebigen Typ, der IEnumerable implementiert:

string.Join(Trennzeichen, enumerierbar);

Und dies gilt für ein Enumerables von benutzerdefinierten Objekten:

string.Join(Trennzeichen, enumerierbar.Select(i => i.Boo));

Altes .NET (vor .NET 4)

Dies gilt für ein String-Array:

string.Join(Trennzeichen, array);

Dies gilt für eine List:

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

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

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

30 Stimmen

String.Join hat eine Überladung, die einen IEnumerable akzeptiert, sodass Sie den Aufruf von ToArray() nicht benötigen

13 Stimmen

Denken Sie daran, dass die IEnumerable-Überladung nur in Version 4.0 oder neuer existiert. Wenn Sie eine ältere Version verwenden, benötigen Sie immer noch ToArray().

3 Stimmen

Ah! Diese letzte Überlastung war die, die ich gesucht habe. Ich wusste, es musste einen Weg geben, eine bestimmte Eigenschaft zu extrahieren. :)

60voto

dev.bv Punkte 940
Verwenden von System.Linq;

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

List persons = new List();

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

27voto

Jacob Proffitt Punkte 12454

Gute Frage. Ich habe bisher benutzt

List myStrings = new List{ "unsere", "meine", "deine"};
string joinedString = string.Join(", ", myStrings.ToArray());

Es ist kein LINQ, aber es funktioniert.

0 Stimmen

Warum musst du .ToArray() aufrufen?

3 Stimmen

Weil in den schlechten alten Tagen von 2009 string.Join keine Erweiterung hatte, die ein IEnumerable akzeptierte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X