2013-07-29 57 views
10

我如何將ListView.Items投射到List<string>將ListView Items列出來<string>?

這是我的嘗試:

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

但我收到此錯誤:

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

回答

28

一個ListViewItemCollection正是這聽起來像 - ListViewItem元素的集合。這是而不是字符串的集合。您的代碼在執行時失敗,出於同樣的原因,該代碼會在編譯時失敗:如果你想串,每個從ListViewItemText財產採取的列表

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

,你可以做這很容易:

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

爲什麼我只能看到文件名而不是整個路徑? – user2214609

+2

@ user2214609:我不知道,因爲我們甚至不知道'ListView'包含文件名。這聽起來像你應該問,作爲一個單獨的問題 - 在ListViewItem中填充文件名的Text屬性的內容與將ListViewItem值的集合轉換爲「列表'。 –

+0

如果我沒有Cast或任何LINQ函數,我該怎麼辦? (WinForm項目) – 2015-11-28 14:37:49

5

Cast方法本質上嘗試執行盒/拆箱,所以如果項目會失敗在列表中不是字符串。試試這個:

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

或者這

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

不會將您的第一個例子給你一個列表,其中的每一個元素是字符串「System.Windows.Forms的。 ListViewItem「? –

+0

看起來它會給「ListViewItem:{text here}」 – Blorgbeard

+0

@AdamV我不確定我的頭頂是什麼ListViewItem.ToString將返回(這就是爲什麼我給了備用解決方案)。 'ListViewItem'沒有[覆蓋'ToString'](http://msdn.microsoft.com/en-us/library/9syath98.aspx),所以我認爲它做的不僅僅是返回它自己的類型名稱。 –

4

嘗試是這樣的

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

@Downvoter不要忘記發表評論 –

3

試試這個使用Select方法:

的列表文本:

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

的列表值:

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

或者,也許,對於:

Dictionary<string, string> files = lvFiles.Items.ToDictionary(key => key.Value, item => item.Text);