好的,所以在花了最近几年的c#编码后,我现在正在开始一份新工作并使用VB.net。我试图找出如何编写lambda表达式,我想我有点想通了,例如:
在C#中我可以写
var checkedItems = lvwCharges.Items.Where(item => item.Checked)
在VB.Net中它会成为:
Dim checkedItems = lvwCharges.Items.Where(Function(item) item.Checked)
所以,我认为我有语法,但我的问题是为什么VB.Net将“item”视为Object而不是ListViewItem,它是什么?我是否必须在我的lamda某处投射到listviewitem?看起来它应该知道item是ListViewItem,所以我不确定是怎么回事。
任何见解都将不胜感激!
谢谢!
答案 0 :(得分:1)
ListViewItemCollection
未实现IEnumerable<ListViewItem>
,因此LINQ函数中的item
将不会被隐式输入(因此类型为Object
)。
这很容易解决。在尝试使用任何lambda表达式之前,只需转换Items
集合:
var checkedItems = lvwCharges.Items.Cast<ListViewItem>().Where(item => item.Checked);
此外,如果上面的VB示例按原样编译,则您的项目有Option Strict Off
,其中将允许checkedItems
隐式输入 - 作为{{1 }}
如果它没有编译(可能是因为项目设置为IEnumerable(Of ListViewItem)
),您需要指定Option Strict On
的类型,而不是checkedItems
的类型;因为它现在是从item
的结果隐式输入的。
Cast(Of T)
也就是说,没有什么能阻止你用两种语言明确指定Dim checkedItems As IEnumerable(Of ListViewItem) = ...
的类型:
item
或者
var checkedItems = lvwCharges.Items
.Cast<ListViewItem>()
.Where((ListViewItem item) => item.Checked)