2010-08-26 28 views

Trả lời

617

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 ToArray nữa, kể từ khi có một tình trạng quá tải của String.Join mà phải mất một IEnumerable<string>.

44

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 phi LINQ trong câu trả lời của Quartermeister và tôi nghĩ Aggregate có thể thực hiện chậm hơn (có lẽ nhiều hoạt động nối chuỗi).

+6

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

+1

Vâng tôi nghĩ 'Tổng hợp' tốt hơn cho hoạt động loại Toán. Với chuỗi hoạt động này nó tương tự như 'cho mỗi' ing và chỉ phụ thêm vào một chuỗi rất chậm hiệu quả bởi 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

+0

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

-2
List<string> targets = new List<string>(); 

var InboxChecked = true; 
var BannerChecked = false; 
var EmailChecked = true; 

if (InboxChecked) 
{ 
    targets.Add("Inbox"); 
} 

if (BannerChecked) 
{ 
    targets.Add("Banner"); 
} 

if (EmailChecked) 
{ 
    targets.Add("Email"); 
} 

var index = 0; 

if (targets.Any()) 
{ 
    var aggregate = targets.Aggregate((s1, s2) => 
    { 
     return ++index == targets.Count - 1 ? s1 + " and " + s2 : s1 + ", " + s2; 
    }); 

    // aggregate.Dump(); 
} 

// returns -> Inbox and Email 
+8

Tại sao lại ở đây? Nó hầu như không liên quan gì đến OP ...? – Assimilater

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