Làm cách nào để tạo một chuỗi được phân tách bằng dấu phẩy từ ArrayList?


82

Tôi đang lưu trữ ArrayList of Ids trong một tập lệnh xử lý mà tôi muốn đưa ra dưới dạng danh sách được phân tách bằng dấu phẩy để xuất ra nhật ký gỡ lỗi. Có cách nào tôi có thể nhận được điều này một cách dễ dàng mà không cần lặp lại nhiều thứ không?

CHỈNH SỬA: Cảm ơn Joel đã chỉ ra Danh sách (Trong số T) có sẵn trong .net 2.0 trở lên. Điều đó làm cho mọi thứ dễ dàng hơn TẤN nếu bạn có sẵn nó.


Tôi đoán rằng, vì bạn đang sử dụng ArrayList, bạn đang sử dụng .Net 1.0 hay .Net 1.1?
kͩeͣmͮpͥ ͩ

Câu trả lời:


156

Có, tôi đang trả lời câu hỏi của riêng mình, nhưng tôi chưa tìm thấy nó ở đây và nghĩ rằng đây là một điều khá bóng bẩy:

... trong VB.NET:

String.Join(",", CType(TargetArrayList.ToArray(Type.GetType("System.String")), String()))

... trong C #

string.Join(",", (string[])TargetArrayList.ToArray(Type.GetType("System.String")))

Điều "có lợi" duy nhất đối với những điều này là ArrayList phải có các mục được lưu trữ dưới dạng Chuỗi nếu bạn đang sử dụng Option Nghiêm ngặt để đảm bảo chuyển đổi diễn ra đúng cách.

CHỈNH SỬA: Nếu bạn đang sử dụng .net 2.0 trở lên, chỉ cần tạo một đối tượng loại Danh sách (Chuỗi) và bạn có thể nhận được những gì bạn cần. Rất cảm ơn Joel đã đưa ra điều này!

String.Join(",", TargetList.ToArray())

2
Có những "gotchas" khác. Một là giải pháp này không mang tính thành ngữ như tự mình lặp lại danh sách. Thứ hai, nếu ToArray duyệt qua bộ sưu tập và Join cũng vậy, quá trình này mất gấp đôi thời gian so với một vòng lặp foreach đơn giản.
Bill the Lizard

Tất nhiên luôn có khả năng sử dụng System.Collections.Specialized.StringCollection.
ICR

Nếu bạn có thể cân nhắc sử dụng một List <string> để thay thế, nó có phương thức ToArray () tích hợp sẵn và giảm thiểu các vấn đề về kiểu. BTW - typeof (string) được ưu tiên hơn Type.GetType ("System.String").
Jon B

17

Các giải pháp cho đến nay đều khá phức tạp. Giải pháp thành ngữ chắc chắn phải là:

String.Join(",", x.Cast(Of String)().ToArray())

Không cần phải nhào lộn cầu kỳ trong các phiên bản khung mới. Giả sử một phiên bản không quá hiện đại, cách sau sẽ dễ dàng nhất:

Console.WriteLine(String.Join(",", CType(x.ToArray(GetType(String)), String())))

Giải pháp thứ hai của mspmsp cũng là một cách tiếp cận tốt nhưng nó không hoạt động vì nó bỏ sót AddressOftừ khóa. Ngoài ra, Convert.ToStringnó khá kém hiệu quả (rất nhiều đánh giá nội bộ không cần thiết) và Convertlớp học nói chung không được thiết kế sạch sẽ. Tôi có xu hướng tránh nó, đặc biệt là vì nó hoàn toàn dư thừa.


Không phải CType và CStr về cơ bản là những lời gọi vào lớp Convert?
Joel Coehoorn 17/10/08

@Echostorm: tôi nói vậy ở đâu? @Joel: không hề. Hầu hết thời gian, họ gọi MS.VB.CS.Conversions.ToStringhàm trợ giúp dẫn đến một ToStringcuộc gọi đơn giản . Nhưng ngay cả phương pháp này, tôi sẽ không gọi y trực tiếp (trái ngược với thông qua các toán tử ép kiểu VB).
Konrad Rudolph

16

Cái gì đó như:

String.Join(",", myArrayList.toArray(string.GetType()) );

Về cơ bản các vòng lặp mà bạn biết ...

BIÊN TẬP

làm thế nào về:

string.Join(",", Array.ConvertAll<object, string>(a.ToArray(), Convert.ToString));

oops .... không đúng ... thế còn: string.Join (",", Array.ConvertAll <object, string> (a.ToArray (), Convert.ToString));
mspmsp 17/10/08

8

string.Join(" ,", myArrayList.ToArray()); Điều này sẽ hoạt động với .net framework 4.5


2

Dưới đây là một ví dụ đơn giản minh họa việc tạo một chuỗi được phân tách bằng dấu phẩy bằng cách sử dụng String.Join () từ danh sách các Chuỗi:

List<string> histList = new List<string>();
histList.Add(dt.ToString("MM/dd/yyyy::HH:mm:ss.ffff"));
histList.Add(Index.ToString());
/*arValue is array of Singles */
foreach (Single s in arValue)
{
     histList.Add(s.ToString());
}
String HistLine = String.Join(",", histList.ToArray());

1
foo.ToArray().Aggregate((a, b) => (a + "," + b)).ToString()

hoặc là

string.Concat(foo.ToArray().Select(a => a += ",").ToArray())

Đang cập nhật, vì điều này rất cũ. Tất nhiên, bạn nên sử dụng string.Join ngay bây giờ. Nó không tồn tại như một tùy chọn tại thời điểm viết bài.


Wow, tôi thực sự xin lỗi! Tôi hoàn toàn bỏ qua thẻ “C #” trên câu hỏi và phỏng đoán câu trả lời của bạn có nghĩa là mã VB hợp lệ. Xấu hổ cho tôi. Nhưng trong khi chúng ta đang thử nghiệm: câu trả lời thứ hai của bạn thêm một dấu “,” ở cuối.
Konrad Rudolph
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.