使用LINQ获取List中匹配值的索引

Tob*_*oby 6 .net linq vb.net

我希望能够在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)
Run Code Online (Sandbox Code Playgroud)

我希望能够查询列表,如下所示:

Dim test As Integer = 5
Dim index = (From i In widgetList
             Where i.foo = test
             Select i.index).First
Run Code Online (Sandbox Code Playgroud)

这样的索引包含第一个listItem的索引,其中widgetList.Item(index).foo = 5.执行此操作的最佳方法是什么?(或者我应该使用LINQ)

我已经看到了几种C#方法来做到这一点,但我不能充分利用C#来了解如何在VB中使用它们

Ahm*_*eed 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
Run Code Online (Sandbox Code Playgroud)

Select我按原样投影Widget,使用o,i参数代表索引.接下来我使用FirstOrDefault谓词进行评估Foo(你可以使用Where后跟FirstOrDefault,但这更短).你应该使用FirstOrDefault而不是First万一没有找到任何项目; FirstOrDefault如果没有找到,将返回null,而First抛出异常.这就是为什么下一步是检查结果并确保它不为空.