2013-07-29 30 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);