使用 Linq 搜索匿名类型列表

Search Anonymous Type List with Linq

提问人:jocoder 提问时间:7/22/2023 更新时间:7/24/2023 访问量:32

问:

有没有更好的方法可以在匿名类型列表中查找值?我想使用 linq。

Sub Main()
    Dim listOfAnonymousTypes = {
        New With {.Name = "John", .Age = 30},
        New With {.Name = "Alice", .Age = 25},
        New With {.Name = "Bob", .Age = 28}
    }

    Dim age = FindPersonsAge(listOfAnonymousTypes, "Bob")
End Sub
Function FindPersonsAge(list As Object, name As String) As Integer
    Dim result = Nothing
    For Each p In list
        If p.Name = name Then
            result = p.Age
            Exit For
        End If
    Next
    Return result
End Function
.NET 列表 LINQ 类型 匿名

评论

1赞 Jimi 7/23/2023
这有什么用?为什么不使用 List(Of Class) 或例如 List(可以是接收方的命名)?List(Of Tuple)

答:

0赞 Tim Schmelter 7/23/2023 #1

是的

Dim age = listOfAnonymousTypes.FirstOrdefault(Function(x) x.Name = "Bob")?.Age

请注意,结果是 because 的 null 条件运算符。因此,如果没有“Bob”,则结果为 。可以使用 和 获取 -value。Integer?NothingHasValueValueInteger

0赞 Enigmativity 7/24/2023 #2

如果将编译器置于模式,则会发现当前 VB.Net 无法编译。目前,它是不安全的代码,依赖于动态调度来工作。这只会让你更有可能写出有缺陷的代码。Option Strict On

要使方法强类型化,您需要这样做:

Function FindPersonsAge(Of T, R)( _
        list As IEnumerable(Of T), _
        predicate As Func(Of T, Boolean), _
        projection As Func(Of T, R)) As R
    For Each p In list
        If predicate(p) Then
            Return projection(p)
        End If
    Next
End Function

它是这样称呼的:

Dim age = _
    FindPersonsAge( _
        listOfAnonymousTypes, _
        Function (x) x.Name = "Bob", _
        Function (x) x.Age)

当然,它现在几乎是一个 LINQ 查询。这将是这样写的:

Dim age = _
    listOfAnonymousTypes _
        .Where(Function (x) x.Name = "Bob") _
        .Select(Function (x) x.Age) _
        .FirstOrDefault()

将其用作 LINQ 可能更容易、更安全。