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

时间:2013-08-27 14:40:01

标签: .net vb.net linq

我希望能够在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中使用它们

2 个答案:

答案 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,使用oi参数代表索引。接下来,我使用带有谓词的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