我希望能够在BindingList(Of T)上运行LINQ查询,该查询返回索引,其中列表对象成员等于特定值。
说我有一个类小部件的简单对象列表:
Public Class widget
Public Property foo As Integer
Public Property bar As String
End Class
Dim widgetList As BindingList(Of widget)
我希望能够查询列表,如下所示:
Dim test As Integer = 5
Dim index = (From i In widgetList
Where i.foo = test
Select i.index).First
这样索引包含第一个listItem的索引,其中widgetList.Item(index).foo = 5.执行此操作的最佳方法是什么? (或者我应该使用LINQ)
我已经看过几种C#方法来做到这一点,但我不能充分利用C#了解如何在VB中使用它们
答案 0 :(得分:6)
通过使用流畅的语法可以实现LINQ,因为有Select
扩展方法的重载版本,可以让你获得项目的索引。
尝试这种方法:
Dim test As Integer = 5
Dim query = widgetList.Select(Function(o,i) New With { .Widget = o, .Index = i}) _
.FirstOrDefault(Function(item) item.Widget.Foo = test)
If query Is Nothing
Console.WriteLine("Item not found")
Else
Console.WriteLine("Item found at index {0}", query.Index)
End If
在Select
我按原样投影Widget,使用o
,i
参数代表索引。接下来,我使用带有谓词的FirstOrDefault
来评估Foo
(您可以使用Where
后跟FirstOrDefault
,但这更短)。如果没有找到任何项目,您应该使用FirstOrDefault
而不是First
;如果没有找到任何内容,FirstOrDefault
将返回null,而First
将抛出异常。这就是为什么下一步是检查结果并确保它不为空。
答案 1 :(得分:1)
我也找到了一个如下工作方案,但我不确定这是否比其他答案更好或更差。
Dim index = Enumerable.Range(0, widgetList.Count) _
.Where(Function(i) widgetList.Item(i).foo = test) _
.First