6

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

4

2 回答 2

7

使用 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将抛出异常。这就是为什么下一步是检查结果并确保它不为空。

于 2013-08-27T15:09:13.320 回答
1

我还找到了一个如下的工作解决方案,但我不确定这是否比其他答案更好或更差。

Dim index = Enumerable.Range(0, widgetList.Count) _
            .Where(Function(i) widgetList.Item(i).foo = test) _
            .First
于 2013-08-27T15:23:22.323 回答