Rol*_*and 14 c# linq collections ienumerable listbox
虽然学习C#非常快,但我对这个Collection语法问题感到磕磕绊绊.
我将自己类型MyItem的一些对象添加到listbox lstData.现在我需要在这个列表框中搜索并想到使用优雅的LINQ表示法,如:
lstData.Items.Where(x => x.Text == SearchString)
Run Code Online (Sandbox Code Playgroud)
但是列表框的项目没有.Where(),尽管我确实包含了"using System.Linq;" 命名空间.
所以我尝试过:
foreach (MyItem item in (MyItem)lstData.Items)
Run Code Online (Sandbox Code Playgroud)
但这会产生构建错误:无法将类型'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;
}
}
Run Code Online (Sandbox Code Playgroud)
和类似的版本:
var item_enum = lstData.Items.GetEnumerator();
while (item_enum.MoveNext()) { etc etc... }
Run Code Online (Sandbox Code Playgroud)
结果证明是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;
}
Run Code Online (Sandbox Code Playgroud)
我不知道这是否真的比"fortran"方式好(见上文),但它确实教会了我可以在其他C#查询中使用的方法.
Jan*_*Jan 17
items集合不是强类型集合.您可以使用IEnumerable<T>.OfType()
或IEnumerable<T>.Cast()
扩展方法获取LINQ世界的条目,您可以在其中过滤条目:
var filteredItems = lstData.Items.OfType<MyItem>().Where(i => i.Prop == val);
Run Code Online (Sandbox Code Playgroud)
Cast和OfType之间的区别是:
OfType<T>
只会将可浇铸的物品退回到T型Cast<T>
如果集合中至少有一个项目不能转换为T,则会失败Chr*_*air 12
尝试使用第Cast<T>
一个执行转换为您期望的类型.那是:
lstData.Items.Cast<MyItem>().Where(x => x.Text == SearchString)
归档时间: |
|
查看次数: |
10151 次 |
最近记录: |