2013-08-09 11 views
10

Mam instancję typu List<string[]> Chciałbym przekonwertować to na ciąg znaków z każdym string[] na linii nowej. Używam następującej kwerendy LINQ, aby spłaszczyć listę, ale nie jestem pewien, jak mogę dodać nową linię między każdym string[] bez rozwijania moje zapytanie do czegoś o wiele bardziej brzydki. Czy istnieje sposób, aby to zrobić bez patroszenia moje zapytanie i przy użyciu String.Join lub IEnumberable.Aggregate wewnątrz pętli foreach?Flatten List <string[]> w pojedynczy ciąg z jedną linią dla każdego elementu

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

Czy możesz podać przykładowe wyjście? Wejście również byłoby miłe. – Xcelled194

+0

@ Xcelled194 Mogłem, ale są już dwie działające odpowiedzi. – evanmcdonnal

+1

Nie było, kiedy opublikowałem komentarz. : P Powinieneś dodać trochę, aby pomóc przyszłym użytkownikom z tym samym problemem. – Xcelled194

Odpowiedz

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

Kompletna próbka:

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

Wynik:

this, should, be, on 
other, line 

UPDATE Tutaj jest agregacja zrobione dobrze - używa StringBuilder zbudować pojedynczy st pierścień w pamięci

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

Dobra rozmowa ... Czuję się głupio zadając pytanie, widząc, jak proste jest rozwiązanie: | – evanmcdonnal

+1

@evanmcdonnal yep :) BTW String.Join jest również wydajny - nie produkuje ton ciągów podczas łączenia. –

+0

Zastanawiałem się, czy nie otworzyć innego pytania na temat różnic w IL produkowanych przez 'String.Join' i' Aggregate' dla konkatenacji ... Może będę musiał. – evanmcdonnal

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

Należy zauważyć, że to rozwiązanie jest * znacznie * mniej wydajne niż rozwiązanie zamieszczone za pomocą 'String.Join', ponieważ stworzy * * * pośrednich ciągów znaków, co spowoduje wiele niepotrzebnego kopiowania pamięci i znacznie większe zużycie pamięciowy. – Servy

Powiązane problemy