【问题标题】:C# listbox Collection syntaxC# 列表框集合语法
【发布时间】:2012-11-26 15:14:23
【问题描述】:

在快速学习 C# 的同时,我遇到了这个 Collection 语法问题。

我向列表框 lstData 添加了一些我自己的 MyItem 类型的对象。现在我需要在这个列表框中进行搜索,并考虑使用优雅的 LINQ 表示法,例如:

lstData.Items.Where(x => x.Text == SearchString)

但列表框的项目没有 .Where(),尽管我确实包含了“使用 System.Linq;”命名空间。

所以我尝试了:

foreach (MyItem item in (MyItem)lstData.Items)

但这会产生构建错误:无法将类型“System.Windows.Forms.ListBox.ObjectCollection”转换为“MySandbox.frmListboxDemo.MyItem”。

我确实设法写了一些可行的东西:

        for (int i = 0; i < lstData.Items.Count; i++)
        {
            MyItem item = (MyItem)lstData.Items[i];
            if (item.Text == SearchString)
            {
                lstData.SetSelected(i, true);
                break;
            }
        }

以及类似的版本:

        var item_enum = lstData.Items.GetEnumerator();
        while (item_enum.MoveNext()) { etc etc... }

结果是 2 行长,并且没有弄清楚什么可以代替 'var'。

我不确定我是否了解如何使用集合、ObjectCollections、枚举器等,但我很想学习。特别是如果 .Where() 版本是可能的和/或更好的。


感谢您的所有回答。我最终得到了这个解决方案:

        var item_iter = lstData.Items.Cast<MyItem>()
                          .Where(x => x.Text.Trim().ToLower() == txtItemName.Text);
        foreach (MyItem item in item_iter)
        {
            int i = lstData.Items.IndexOf(item);
            lstData.SetSelected(i, true);
            break;
        }

我不知道这是否真的比“fortran”方式好得多(见上文),但它确实教会了我可以在其他 C# 查询中使用的方法。

【问题讨论】:

    标签: c# linq collections listbox ienumerable


    【解决方案1】:

    items 集合不是强类型集合。您可以使用 IEnumerable&lt;T&gt;.OfType()IEnumerable&lt;T&gt;.Cast() 扩展方法来获取 LINQ 世界的条目,您可以在其中过滤条目:

    var filteredItems = lstData.Items.OfType<MyItem>().Where(i => i.Prop == val);
    

    Cast和OfType的区别是:

    • OfType&lt;T&gt; 只会返回可转换为 T 类型的项目
    • Cast&lt;T&gt; 将失败,当集合中至少有一项不可转换为 T 时

    【讨论】:

    • 完美答案.. 一件小事,在 OfType - OfType().Where(... 之后必须有 () 括号
    【解决方案2】:

    首先尝试使用Cast&lt;T&gt; 执行转换为您期望的类型。那就是:

    lstData.Items.Cast&lt;MyItem&gt;().Where(x =&gt; x.Text == SearchString)

    【讨论】:

    • 现在的错误是:'System.Linq.Enumerable.Cast(System.Collections.IEnumerable)' 是一个'方法',在给定的上下文中无效
    • @Roland 对不起,我忘了() 来调用它。 (我打算像@Jan 一样修复并添加更多内容,但被叫走了)
    • 克里斯,感谢您的帮助。经过一番思考,我自己找到了()。我得到了这个工作。现在我只需要阅读所有其他 cmets 以获得有趣的点。
    【解决方案3】:

    ListBox.ObjectCollection 实现 IEnumerable,但不是大多数 Linq 方法需要的通用 IEnumerable&lt;T&gt;

    到达IEnumerable&lt;T&gt; 并一步解决您的选角问题的一种方法是使用Cast&lt;T&gt;

    lstData.Items.Cast<MyItem>().Where(x => x.Text == SearchString)
    

    【讨论】:

      【解决方案4】:

      尝试从项目中列出一个列表:

      (new ListBox()).Items.OfType<ListViewItem>().Where(......); 
      

      可能是因为它最初是用早期版本的 .net 构建的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-19
        • 2018-08-15
        • 1970-01-01
        • 1970-01-01
        • 2013-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多