2013-08-09 23 views
10

Tôi có một thể hiện kiểu List<string[]> Tôi sẽ chuyển đổi thành chuỗi với mỗi string[] trên một dòng mới. Tôi đang sử dụng truy vấn LINQ sau đây để flatten ra danh sách Tuy nhiên tôi không chắc làm thế nào tôi có thể thêm một dòng mới giữa mỗi string[] mà không cần mở rộng truy vấn của tôi vào một cái gì đó xấu xí hơn nhiều. Có cách nào để thực hiện điều đó mà không cần truy vấn của tôi và sử dụng String.Join hoặc IEnumberable.Aggregate bên trong vòng lặp foreach?Flatten List <string[]> thành chuỗi đơn với một dòng cho mỗi phần tử

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

Bạn có thể cung cấp một số đầu ra mẫu không? Đầu vào cũng sẽ tốt đẹp. – Xcelled194

+0

@ Xcelled194 Tôi có thể nhưng đã có hai câu trả lời. – evanmcdonnal

+1

Không có khi tôi đăng bình luận. : P Bạn vẫn nên thêm một số, để giúp những người tìm kiếm trong tương lai có cùng một vấn đề. – Xcelled194

Trả lời

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

Toàn bộ mẫu:

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

Kết quả:

this, should, be, on 
other, line 

CẬP NHẬT Dưới đây là tập hợp thực hiện ngay - nó sử dụng StringBuilder để xây dựng đơn st đổ chuông trong bộ nhớ

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

Cuộc gọi tốt ... Tôi cảm thấy ngớ ngẩn khi đặt câu hỏi sau khi thấy giải pháp đơn giản như thế nào là: | – evanmcdonnal

+1

@evanmcdonnal yep :) BTW String.Join cũng hiệu quả - nó không tạo ra tấn chuỗi khi tham gia. –

+0

Tôi đã thực sự xem xét việc mở một câu hỏi khác về sự khác biệt trong IL được tạo ra bởi 'String.Join' và' Aggregate' cho phép nối ... Có lẽ tôi sẽ phải làm vậy. – evanmcdonnal

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

Lưu ý rằng giải pháp này là * đáng kể * kém hiệu quả hơn giải pháp được đăng bằng cách sử dụng 'String.Join' vì nó sẽ tạo ra * nhiều * chuỗi trung gian, điều này sẽ dẫn đến việc sao chép bộ nhớ không cần thiết và tiêu thụ cao hơn nhiều bộ nhớ. – Servy

Các vấn đề liên quan