在快速学习 C# 的同时,我偶然发现了这个 Collection 语法问题。
我将一些我自己的 MyItem 类型的对象添加到列表框 lstData。现在我需要在这个列表框中进行搜索,并考虑使用优雅的 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”。
我不确定我是否了解如何使用 Collections、ObjectCollections、Enumerators 等,但我渴望学习。特别是如果 .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# 查询中使用的方法。