You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 20:24:54