繁体   English   中英

C#listbox集合语法

[英]C# listbox Collection syntax

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

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

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

Cast和OfType之间的区别是:

  • OfType<T>将只返回可转换为T类的项目
  • 如果集合中至少有一个项目不能转换为T,则Cast<T>将失败

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

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

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

获取IEnumerable<T>并一步解决您的转换问题的一种方法是使用Cast<T>

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM