提问人:jocoder 提问时间:7/22/2023 更新时间:7/24/2023 访问量:32
使用 Linq 搜索匿名类型列表
Search Anonymous Type List with Linq
问:
有没有更好的方法可以在匿名类型列表中查找值?我想使用 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
答:
0赞
Tim Schmelter
7/23/2023
#1
是的
Dim age = listOfAnonymousTypes.FirstOrdefault(Function(x) x.Name = "Bob")?.Age
请注意,结果是 because 的 null 条件运算符。因此,如果没有“Bob”,则结果为 。可以使用 和 获取 -value。Integer?
Nothing
HasValue
Value
Integer
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 可能更容易、更安全。
评论
List(Of Tuple)