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.


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)

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.


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

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

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.


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

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

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!


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));
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.