2010-05-26 41 views
31

Đây có thể là một cái gì đó ngớ ngẩn tôi đã bỏ lỡ, nhưng tôi cố gắng để nối một danh sách các số nguyên thay vì tổng hợp chúng với:LINQ: Làm cách nào để nối một danh sách các số nguyên vào chuỗi phân cách bằng dấu phẩy?

integerArray.Aggregate((accumulator, piece) => accumulator+"," + piece) 

Trình biên dịch phàn nàn về lỗi lập luận. Có cách nào khéo léo để làm điều này mà không cần phải đi qua một vòng lặp?

Trả lời

54

Phiên bản .NET nào? Trong 4.0, bạn có thể sử dụng string.Join(",",integerArray). Trong 3.5 tôi sẽ bị cám dỗ chỉ sử dụng string.Join(",",Array.ConvertAll(integerArray,i=>i.ToString())); (giả sử nó một mảng). Nếu không, hãy đặt một mảng hoặc sử dụng StringBuilder.

+0

sẽ không phải lúc nào cũng tốt nhất để sử dụng StringBuilder trong trường hợp này? –

+4

Rất kỳ quặc, Tham gia có hiệu suất cao hơn với StringBuilder. Tôi đã làm một thử nghiệm, và với một mảng có kích thước 1.000.000, Join mất 207ms, trong khi StringBuilder mất 264ms. Tôi nghi ngờ điều này là bởi vì các Tham gia được tối ưu hóa cho nhiệm vụ, trong khi SB được tối ưu hóa nhiều hơn cho trường hợp chung. – Cyberherbalist

+0

Nếu tôi không có kiểu 'Array' để bắt đầu, có chênh lệch tốc độ giữa' Array.ConvertAll (list.ToArray(), ...) 'so với' IEnumerable.Select (...).() '? – Michael

14

Lỗi bạn nhận được là do bạn không sử dụng ghi đè Aggregate cho phép bạn chỉ định hạt giống. Nếu bạn không chỉ định hạt giống, nó sẽ sử dụng loại bộ sưu tập.

integerArray.Aggregate("", (accumulator, piece) => accumulator + "," + piece); 
+1

+1 vì bạn đã trả lời câu hỏi. Tuy nhiên, mã của bạn có hiệu suất O (n^2). Không mát mẻ. –

+0

bây giờ đếm số chuỗi liên quan ... –

+1

@KennetBelenky, 'Tổng hợp' không là gì ngoài vòng lặp foreach đặt giá trị của một biến. - Đó là O (n) không O (n^2)? – ebb

2

Chỉ cần thêm thay thế khác để @ Marc

var list = string.Join(",", integerArray.Select(i => i.ToString()).ToArray()); 
11

Bạn có thể muốn sử dụng String.Join.

string.Join(",", integerArray.Select(i => i.ToString()).ToArray()); 

Nếu bạn đang sử dụng .Net 4.0, bạn không cần phải gặp rắc rối khi sửa đổi mảng. và chỉ có thể làm

string.Join(",", integerArray); 
+0

Slick! Thực sự hữu ích. – Cyberherbalist

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