【问题标题】:Cast ListView Items to List<string>?将 ListView 项目投射到 List<string>?
【发布时间】:2013-07-29 18:21:00
【问题描述】:

如何将ListView.Items 转换为List&lt;string&gt;

这是我尝试过的:

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

但我收到了这个错误:

无法将“System.Windows.Forms.ListViewItem”类型的对象转换为“System.String”类型。

【问题讨论】:

    标签: c# winforms listviewitem


    【解决方案1】:

    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();
    

    【讨论】:

    • 你的第一个例子不会给你一个列表,其中每个元素都是字符串“System.Windows.Forms.ListViewItem”吗?
    • 看起来会给出“ListViewItem: {text here}”
    • @AdamV 我不确定ListViewItem.ToString 会返回什么(这就是我提供替代解决方案的原因)。 ListViewItem 确实 override ToString 所以我认为它所做的不仅仅是返回它自己的类型名称。
    • 为什么我只能看到文件名而不是整个路径?
    • 演员不再存在。
    【解决方案2】:

    试试这样的

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

    【讨论】:

    • 演员不再存在。
    【解决方案3】:

    ListViewItemCollection 正是它听起来的样子——ListViewItem 元素的集合。它不是字符串的集合。您的代码在执行时失败,原因与此代码在编译时失败的原因相同:

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

    如果您想要一个字符串列表,每个字符串都取自 ListViewItemText 属性,您可以轻松做到:

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

    【讨论】:

    • 为什么我只能看到文件名而不是整个路径?
    • @user2214609:我不知道,因为我们甚至不知道ListView 包含文件名。听起来您应该将其作为一个单独的问题提出-ListViewItem 上填充有文件名的Text 属性的内容与转换@987654330 的集合是一个非常不同的问题@ 值到 List&lt;string&gt;.
    • 如果我根本没有 Cast 或任何 LINQ 函数,我该怎么办? (WinForm 项目)
    • @user1803300:为什么你不会有 LINQ?
    • @user1803300:嗯,不,LINQ 与 WPF 无关。只要您的目标是 .NET 3.5 或更高版本,就应该没问题。确保你有一个using 指令用于System.Linq
    【解决方案4】:

    使用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);
    

    【讨论】:

      猜你喜欢
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      相关资源
      最近更新 更多