如何使用LINQ在匿名类型列表中查找值?优化现有循环实现
使用LINQ优化匿名类型列表的查找操作
当然可以用LINQ替代循环,不仅代码更简洁,还能保留强类型检查,避免原代码里的类型安全问题。
直接在调用处使用LINQ(最简洁的方式)
Sub Main() Dim listOfAnonymousTypes = { New With {.Name = "John", .Age = 30}, New With {.Name = "Alice", .Age = 25}, New With {.Name = "Bob", .Age = 28} } ' 查找第一个Name匹配的项,处理未找到的情况 Dim targetPerson = listOfAnonymousTypes.FirstOrDefault(Function(p) p.Name = "Bob") Dim age = If(targetPerson IsNot Nothing, targetPerson.Age, -1) ' 用-1表示未找到,可根据需求调整 End Sub
封装成可复用的泛型函数
如果需要多次复用查找逻辑,可以用泛型函数适配匿名类型(编译器会自动推断类型):
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", Function(p) p.Age, Function(p) p.Name) End Sub Function FindPersonsAge(Of T)(list As IEnumerable(Of T), targetName As String, getAge As Func(Of T, Integer), getName As Func(Of T, String)) As Integer Dim matchedPerson = list.FirstOrDefault(Function(p) getName(p) = targetName) Return If(matchedPerson IsNot Nothing, getAge(matchedPerson), -1) End Function
为什么比原代码更优
- 强类型安全:原代码将列表转为
Object,编译时无法检查p.Name/p.Age的拼写错误,运行时才会报错;LINQ方式保留了匿名类型的强类型,编译时就能发现问题。 - 代码简洁:直接表达“查找第一个匹配Name的项”的业务意图,无需手动写循环和
Exit For。 - 可维护性:LINQ语义清晰,后续修改查找条件(比如匹配年龄范围)更方便。
注意事项
- 如果确定列表中只会有一个匹配项,可以用
SingleOrDefault替代FirstOrDefault,这样如果出现多个匹配项会抛出异常,避免逻辑错误。 - 务必处理未找到的情况(比如返回-1、
Nullable(Of Integer)等),否则会触发NullReferenceException。
内容的提问来源于stack exchange,提问作者jocoder
相关产品推荐
相关产品推荐

