Chuyển đổi một danh sách <int> thành một chuỗi được phân tách bằng dấu phẩy


116

Có cách nào để lấy một Danh sách và chuyển đổi nó thành một chuỗi được phân tách bằng dấu phẩy không?

Tôi biết tôi có thể lặp lại và xây dựng nó, nhưng bằng cách nào đó, tôi nghĩ một số bạn có cách làm hay hơn?

Tôi thực sự muốn tìm hiểu những loại 'thủ thuật' này, vì vậy vui lòng giải thích hoặc liên kết đến các tài liệu về phương pháp bạn sử dụng.

Câu trả lời:


189
List<int> list = ...;
string.Join(",", list.Select(n => n.ToString()).ToArray())

7
Thông minh nhưng chậm và cồng kềnh, vì nó phân bổ một chuỗi cho mỗi phần tử. Sử dụng StringBuilder sẽ hiệu quả hơn nhiều.
Steven Sudit

3
Từ những gì tôi thấy trực tuyến (tìm kiếm nhanh) String.Join nhanh hơn so với sử dụng StringBuilder.
Yuriy Faktorovich

3
stackoverflow.com/questions/585860/... , bạn là không chính xác Steven
Yuriy Faktorovich

6
Tôi nghĩ Steven đang đề cập đến phần n.ToString () hơn là String.Join.
Larsenal

9
Larsenal: nhưng StringBuilder.Append (Int32) vẫn gọi nội bộ ToString trên số nguyên. StringBuilder không tránh một cách kỳ diệu chi phí phân bổ một chuỗi cho mỗi phần tử; nó chỉ khéo léo che khuất tầm nhìn.
itowlson

115

Giải pháp đơn giản là

List<int> list = new List<int>() {1,2,3};
string.Join<int>(",", list)

Tôi vừa mới sử dụng nó trong mã của mình, hoạt động không linh hoạt.


1
Cảm tạ! đây là cách tiếp cận đẹp
Irfan Ashraf

2
Đây là cách tiếp cận tốt hơn câu trả lời được chấp nhận. Với cách tiếp cận này, bạn không phải nhập Linq và việc này nhanh hơn.
JoKeRxbLaCk

Mát mẻ! Tôi chưa bao giờ biết string.Join có quá tải chung. Cảm ơn.
mrmashal

10
List<int> list = new List<int> { 1, 2, 3 };
Console.WriteLine(String.Join(",", list.Select(i => i.ToString()).ToArray()));

Tuyệt vời nếu bạn không thể sử dụng .NET 4
Greg Woods

6

Để có khoảng một gazillion giải pháp cho phiên bản phức tạp hơn một chút của vấn đề này - nhiều giải pháp trong số đó chậm, có lỗi hoặc thậm chí không biên dịch - hãy xem các nhận xét cho bài viết của tôi về chủ đề này:

http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx

và bình luận của StackOverflow:

Eric Lippert thách thức "phân biệt dấu phẩy", câu trả lời hay nhất?


Cảm ơn các liên kết. Vấn đề nối chuỗi này hóa ra phức tạp hơn và mang tính giáo dục cao hơn tôi mong đợi!
Steven Sudit

4

Để thêm phần thú vị, tôi sẽ đặt đây là một phương thức mở rộng trên IEnumerable <T> để nó hoạt động trên bất kỳ IEnumerable nào:

public static class IEnumerableExtensions {
  public static string BuildString<T>(this IEnumerable<T> self, string delim = ",") {
    return string.Join(delim, self)        
  }
}

Sử dụng nó như sau:

List<int> list = new List<int> { 1, 2, 3 };
Console.WriteLine(list.BuildString(", "));

Hai cách tối ưu hóa có thể có: 1) Nối đoạn mê sảng sau mỗi mục bất kể, sau đó loại bỏ phần thừa sau khi vòng lặp kết thúc. 2) Chỉ định dung lượng cho StringBuilder.
Steven Sudit

1
Nếu bạn tìm hiểu Reflector, hóa ra là Join tổng các độ dài để tính toán trước kích thước bộ đệm và cũng "tính số nguyên tố cho máy bơm" bằng cách thêm chuỗi đầu tiên bên ngoài vòng lặp, sau đó, bên trong vòng lặp, nối vô điều kiện dấu phân cách trước chuỗi tiếp theo. Kết hợp với một số thủ thuật không an toàn / nội bộ nên rất nhanh.
Steven Sudit

@Steven: đã làm theo lời khuyên của bạn.
cdiggins

1
Bạn cố định dấu phân cách trong tiện ích mở rộng của mình và bỏ qua giá trị được chuyển vào cho dấu phân cách và bỏ qua dấu chấm phẩy. Nó phải làreturn string.Join(delim, self);
Andrew

1

Có vẻ nhanh một cách hợp lý.

IList<int> listItem = Enumerable.Range(0, 100000).ToList();
var result = listItem.Aggregate<int, StringBuilder, string>(new StringBuilder(), (strBuild, intVal) => { strBuild.Append(intVal); strBuild.Append(","); return strBuild; }, (strBuild) => strBuild.ToString(0, strBuild.Length - 1));

1

Mục nhập "thông minh" của tôi:

        List<int> list = new List<int> { 1, 2, 3 };
        StringBuilder sb = new StringBuilder();
        var y = list.Skip(1).Aggregate(sb.Append(x.ToString()),
                    (sb1, x) =>  sb1.AppendFormat(",{0}",x));

        // A lot of mess to remove initial comma
        Console.WriteLine(y.ToString().Substring(1,y.Length - 1));

Chỉ là chưa tìm ra cách thêm dấu phẩy có điều kiện.


1
Vui lòng không viết Selectvới các tác dụng phụ trong lambda. Trong trường hợp này, bạn thậm chí không sử dụng y, vì vậy Selectvề cơ bản của bạn chỉ là một foreach- vì vậy hãy viết nó như vậy.
Pavel Minaev

Tôi không đề xuất đây là một giải pháp tốt. OP muốn một cái gì đó thú vị hơn foreach.
Larsenal

Vâng, nhưng lạm dụng Selectnhư đã foreachqua là "thú vị" và thành "lạm dụng". Một cách tiếp cận thú vị hơn ở đây sẽ là sử dụng Enumerable.Aggregatevới StringBuilderlàm giá trị hạt giống - hãy thử điều đó.
Pavel Minaev

Ý tưởng tốt. Tôi phải bước ra, nhưng tôi có thể sẽ quay cuồng.
Larsenal

0

bạn có thể sử dụng, thư viện System.Linq; Nó hiệu quả hơn:

using System.Linq;
string str =string.Join(",", MyList.Select(x => x.NombreAtributo));
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.