Truyền danh sách <int> tới danh sách <string> trong .NET 2.0


96

Bạn có thể bỏ List<int>để List<string>bằng cách nào đó?

Tôi biết tôi có thể lặp lại và .ToString (), nhưng một dàn diễn viên sẽ rất tuyệt.

Tôi đang ở C # 2.0 (vì vậy không có LINQ ).

Câu trả lời:


151

.NET 2.0 có ConvertAllphương thức mà bạn có thể chuyển vào hàm chuyển đổi:

List<int>    l1 = new List<int>(new int[] { 1, 2, 3 } );
List<string> l2 = l1.ConvertAll<string>(delegate(int i) { return i.ToString(); });

116

Cập nhật cho năm 2010

List<int> l1 = new List<int>(new int[] { 1,2,3 } );
List<string> l2 = l1.ConvertAll<string>(x => x.ToString());

6
Cảm ơn! Đây đã cứu tôi một tấn thời gian
Steve Pháp

2
Không, lambdas đã được giới thiệu trong C # 3.0 nên điều này sẽ không hoạt động trong 2.0.
Luke

Tôi thấy rằng nó hoạt động với VS2008 và .NET 2.0, miễn là bạn đã cài đặt ít nhất .NET 3.0. xem stackoverflow.com/questions/3341846/…
igelineau

1
Mọi người nên phân biệt giữa phiên bản .NET và phiên bản C #. Vì mũi tên x => x.ToString()được biên dịch theo cùng loại IL như delegate(int x) { return x.ToString(); }trong trường hợp này, điều quan trọng là phải có một trình biên dịch C # (phiên bản C #) biết đó =>là gì . Khuôn khổ và thời gian chạy (phiên bản .NET) không cần tính năng đặc biệt cho việc này, vì vậy .NET 2.0 ở đây là tốt.
Jeppe Stig Nielsen

Hóa ra bạn có thể bỏ qua <string>và nó vẫn hoạt động. Làm cho nó chỉl1.ConvertAll(x => x.ToString());
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

8

C # 2.0 có làm được List<T>.Convertkhông? Nếu vậy, tôi nghĩ bạn nên sử dụng điều đó với một đại biểu:

List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list.Convert(delegate (int i) { return i.ToString(); });

Một cái gì đó dọc theo những dòng đó.


Ủng hộ câu trả lời của Glenn, đó có thể là mã chính xác ;-)


6

Bạn có thể dùng:

List<int> items = new List<int>(new int[] { 1,2,3 } );
List<string> s = (from i in items select i.ToString()).ToList();

5

Bạn sẽ không thể ép kiểu trực tiếp vì không có kiểu truyền rõ ràng hoặc ẩn nào tồn tại từ int sang chuỗi, nó sẽ phải là một phương thức liên quan đến .ToString () chẳng hạn như: -

foreach (int i in intList) stringList.Add(i.ToString());

Chỉnh sửa - hoặc như những người khác đã chỉ ra khá tuyệt vời, hãy sử dụng intList.ConvertAll (Delegate (int i) {return i.ToString ();});, tuy nhiên rõ ràng bạn vẫn phải sử dụng .ToString () và đó là một chuyển đổi chứ không phải một dàn diễn viên.


3
Sự tồn tại của một tập hợp giữa các loại chung không liên quan gì đến khả năng kết hợp giữa các phép chiếu. IE, ngay cả khi intđược chuyển đổi hoàn toàn hoặc rõ ràng sang string, điều đó không có nghĩa là IE có chuyển đổi List<int>ngầm định hoặc rõ ràng sang List<string>.
Adam Robinson

1

Bạn phải xây dựng một danh sách mới. Các biểu diễn bit cơ bản của List<int>List<string>hoàn toàn không tương thích - ví dụ: trên nền tảng 64 bit, các thành viên riêng lẻ thậm chí không có cùng kích thước.

Về mặt lý thuyết, có thể coi a List<string>là a List<object>- điều này đưa bạn vào thế giới thú vị của hiệp phương sai và phương sai, và hiện không được hỗ trợ bởi C # hoặc VB.NET.


@Curt :> Về mặt lý thuyết, có thể coi> một Danh sách <chuỗi> là một Danh sách <đối tượng> -> điều này đưa bạn vào thế giới thú vị> của hiệp phương sai và phương sai, và> hiện không được C # hoặc> VB hỗ trợ. NET C # và .NET thực sự hỗ trợ Covariance. Chỉ không với thuốc chung.
Christian Hagelid

1

result = listOfInt.Select(i => i.ToString(CultureInfo.InvariantCulture)).ToList()

thay thế kết quả tham số và listOfInt thành tham số của bạn


Đối với tôi làm việc chính xác result = listOfInt.Select (i => i.ToString ()). ToList ();
Sharunas Bielskis
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.