Danh sách C # <chuỗi> thành chuỗi với dấu phân cách


631

Có một chức năng nào trong C # để nhanh chóng chuyển đổi một số bộ sưu tập thành chuỗi và tách các giá trị bằng dấu phân cách không?

Ví dụ:

List<string> names -> string names_together = "John, Anna, Monica"

Câu trả lời:


1201

Bạn có thể sử dụng String.Join. Nếu bạn có một List<string>sau đó bạn có thể gọi ToArrayđầu tiên:

List<string> names = new List<string>() { "John", "Anna", "Monica" };
var result = String.Join(", ", names.ToArray());

Trong .NET 4 bạn không cần ToArraynữa, vì có quá tải String.Joinphải mất một IEnumerable<string>.

Các kết quả:


John, Anna, Monica


95

Bạn cũng có thể làm điều này với linq nếu bạn muốn

var names = new List<string>() { "John", "Anna", "Monica" };
var joinedNames = names.Aggregate((a, b) => a + ", " + b);

Mặc dù tôi thích cú pháp không linq trong câu trả lời của Quartermeister và tôi nghĩ rằng Aggregatecó thể thực hiện chậm hơn (có thể là nhiều hoạt động nối chuỗi hơn).


19
Cảm ơn đã trả lời nhanh, cả hai hoạt động tốt. Bạn nói đúng tôi đã làm một phép đo hiệu suất nhỏ sử dụng lớp Stopwatch và LINQ chiều là chậm hơn nhiều: String.Join ( "", names.ToArray ()); -> lấy 18 tick Tổng hợp ((a, b) => a + "," + b) -> lấy 736 tick
nan

2
Vâng tôi nghĩ Aggregatelà tốt hơn cho các hoạt động loại toán học. Với chuỗi thao tác này, nó tương tự như for eaching và chỉ nối vào một chuỗi rất chậm hiệu quả vì bạn đang tạo một chuỗi mới cho mỗi mục tồn tại trong danh sách.
Bob

Lưu ý rằng Tổng hợp không có giá trị hạt giống sẽ ném một UnlimitedOperationException nếu vùng chứa trống. Sử dụng phiên bản tổng hợp (seed, func) để tránh mã xử lý lỗi hoặc kiểm tra có điều kiện. String.Join không ném vào chỗ trống nên không yêu cầu mã hạt hoặc mã bổ sung ... cộng với nó không yêu cầu Linq và cú pháp rõ ràng hơn một chút.
Huacanacha

1
Tổng hợp trong ví dụ trên có thể hoạt động nhanh hơn nếu bạn sử dụng StringBuilder. Không nên sử dụng '+' để thực hiện nhiều phép nối. Xem phần Ghi chú tại đây ( msdn.microsoft.com/en-us/l Library / trộm )
Ilya Denisov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.