2013-08-09 9 views
10

Ich habe eine Instanz des Typs List<string[]> Ich würde dies in eine Zeichenfolge mit einem string[] auf einem Zeilenumbruch zu konvertieren. Ich verwende die folgende LINQ-Abfrage, um die Liste zu reduzieren, aber ich bin mir nicht sicher, wie ich eine neue Zeile zwischen jedem string[] hinzufügen kann, ohne meine Abfrage in etwas viel hässlicher zu erweitern. Gibt es eine Möglichkeit, dies zu tun, ohne meine Abfrage zu entkernen und String.Join oder IEnumberable.Aggregate innerhalb einer foreach Schleife zu verwenden?Flachen Liste <string[]> in einzelne Zeichenfolge mit einer Zeile für jedes Element

results.SelectMany(x => x).Aggregate((c, n) => c + ", " + n) 
+0

Können Sie einige Beispielausgabe zur Verfügung stellen? Input wäre auch nett. – Xcelled194

+0

@ Xcelled194 Ich könnte aber es gibt bereits zwei funktionierende Antworten. – evanmcdonnal

+1

Es gab nicht als ich den Kommentar gepostet habe. : P Sie sollten noch einige hinzufügen, um zukünftigen Suchern mit dem gleichen Problem zu helfen. – Xcelled194

Antwort

40
String.Join(Environment.NewLine, results.Select(a => String.Join(", ", a))); 

komplette Beispiel:

var results = new List<string[]> { 
    new[]{"this", "should", "be", "on"}, 
    new[]{"other", "line"} 
}; 

var result = String.Join(Environment.NewLine, 
         results.Select(a => String.Join(", ", a))); 

Ergebnis:

this, should, be, on 
other, line 

UPDATE Hier wird Aggregation richtig gemacht - es StringBuilder verwendet einzelne st zu bauen Ring im Speicher

results.Aggregate(new StringBuilder(), 
        (sb, a) => sb.AppendLine(String.Join(",", a)), 
        sb => sb.ToString()); 
+1

Guter Anruf ... Ich fühle mich dumm, die Frage zu stellen, nachdem ich gesehen habe, wie einfach die Lösung ist: | – evanmcdonnal

+1

@evanmcdonnal yep :) BTW String.Join ist auch effizient - es produziert nicht Tonnen von Strings während des Beitritts. –

+0

Ich erwog tatsächlich, eine andere Frage zu den Unterschieden in IL zu stellen, die von 'String.Join' und' Aggregate' für die Verkettung erzeugt werden ... Vielleicht muss ich es tun. – evanmcdonnal

3
results.Select(sa => sa.Aggregate((a, b) => a + ", " + b)) 
     .Aggregate((c, d) => c + Enviroment.NewLine + d); 
+4

Beachten Sie, dass diese Lösung * dramatisch * weniger effizient ist als die gepostete Lösung mit 'String.Join', da sie eine Menge intermediärer Strings erzeugt, was zu unnötigem Kopieren von Speicher und einem viel höheren Verbrauch führt der Erinnerung. – Servy

Verwandte Themen