C#listbox集合语法

时间:2012-11-26 15:14:24

标签: c# linq collections listbox ienumerable

在快速学习C#时,我对这个Collection语法问题感到磕磕绊。

我将自己类型MyItem的一些对象添加到listbox lstData。现在我需要在这个列表框中搜索并想到使用优雅的LINQ表示法,如:

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

但是列表框的项目没有.Where(),尽管我确实包含了“using 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'的内容。

我不确定我是否理解如何使用Collections,ObjectCollections,Enumerators等,但我很想学习。特别是如果.here()版本可行和/或更好。


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

        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#查询中使用的方法。

4 个答案:

答案 0 :(得分:17)

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

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

Cast和OfType之间的区别是:

  • OfType<T>只会将可转换的项目返回到Type T
  • 如果集合中至少有一个项目无法转换为T ,则
  • Cast<T>将失败

答案 1 :(得分:12)

首先尝试使用Cast<T>执行强制转换为您期望的类型。那就是:

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

答案 2 :(得分:1)

ListBox.ObjectCollection实现IEnumerable,但不是大多数Linq方法所需的通用IEnumerable<T>

前往IEnumerable<T>并一步解决投射问题的一种方法是使用Cast<T>

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

答案 3 :(得分:0)

尝试列出项目列表:

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

可能原因是它最初是使用早期版本的.net

构建的