2013-07-29 27 views
10

Tôi làm cách nào để có thể đúc ListView.Items thành List<string>?Cast ListView Items để liệt kê <string>?

Đây là những gì tôi đã cố gắng:

List<string> list = lvFiles.Items.Cast<string>().ToList(); 

nhưng tôi nhận được lỗi này:

Unable to cast object of type 'System.Windows.Forms.ListViewItem' to type 'System.String'.

Trả lời

28

Một ListViewItemCollection là chính xác những gì nó giống như âm thanh - một tập hợp các yếu tố ListViewItem. Đó là không phải một tập hợp các chuỗi. Mã của bạn thất bại ở thời gian thực hiện vì lý do tương tự mà mã này sẽ thất bại tại thời gian biên dịch:

ListViewItem item = lvFiles.Items[0]; 
string text = (string) item; // Invalid cast! 

Nếu bạn muốn có một danh sách các chuỗi, mỗi trong số đó được lấy từ Text tài sản của một ListViewItem, bạn có thể làm đó một cách dễ dàng:

List<string> list = lvFiles.Items.Cast<ListViewItem>() 
           .Select(item => item.Text) 
           .ToList(); 
+0

Tại sao tôi chỉ có thể nhìn thấy tên tệp thay vì toàn bộ đường dẫn? – user2214609

+2

@ user2214609: Tôi không có ý tưởng, cho rằng chúng tôi thậm chí không biết rằng 'ListView' chứa tên tập tin. Có vẻ như bạn nên hỏi đó là một câu hỏi riêng biệt - nội dung của thuộc tính 'Text' trên' ListViewItem' được điền bằng tên tệp là * rất * khác nhau từ việc chuyển đổi tập hợp các giá trị 'ListViewItem' thành' Danh sách '. –

+0

Tôi có thể làm gì nếu tôi không có Cast hoặc bất kỳ chức năng LINQ nào? (Dự án WinForm) –

5

Phương pháp Cast về cơ bản sẽ cố gắng thực hiện một hộp/Unbox, vì vậy nó sẽ thất bại nếu các mục trong danh sách không phải là chuỗi. Hãy thử điều này thay vì:

List<string> list = lvFiles.Items.Cast<ListViewItem>() 
           .Select(x => x.ToString()).ToList(); 

Hoặc này

List<string> list = lvFiles.Items.Cast<ListViewItem>() 
           .Select(x => x.Text).ToList(); 
+0

Sẽ không ví dụ đầu tiên của bạn cung cấp cho bạn một danh sách mà mỗi phần tử là chuỗi "System.Windows.Forms. ListViewItem "? –

+0

Dường như nó sẽ cung cấp cho "ListViewItem: {text here}" – Blorgbeard

+0

@AdamV Tôi không chắc chắn trên đầu của tôi những gì 'ListViewItem.ToString' sẽ trở lại (đó là lý do tại sao tôi đã đưa ra giải pháp thay thế). 'ListViewItem' không [ghi đè' ToString'] (http://msdn.microsoft.com/en-us/library/9syath98.aspx) vì vậy tôi giả sử nó làm một cái gì đó nhiều hơn một chút so với chỉ trả về tên kiểu riêng của nó. –

4

thử một cái gì đó như thế này

List<string> list = lvFiles.Items.Cast<ListViewItem>().Select(x=> x.ToString()).ToList(); 
+0

@Downvoter không quên để bình luận –

3

Hãy thử điều này bằng cách sử dụng phương pháp Select:

cho danh sách văn bản:

List<string> listText = lvFiles.Items.Select(item => item.Text).ToList(); 

cho các giá trị danh sách:

List<string> listValues = lvFiles.Items.Select(item => item.Value).ToList(); 

Hoặc có thể, đối với cả hai:

Dictionary<string, string> files = lvFiles.Items.ToDictionary(key => key.Value, item => item.Text); 
Các vấn đề liên quan