【发布时间】: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