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

使用Lambda表达式筛选嵌套列表中的字符串时遇空引用异常的问题排查

问题分析与修复方案

咱们一步步拆解你遇到的「对象未设置为实例」错误,同时修正代码逻辑:

1. 集合操作的核心逻辑错误

你这段代码里有个明显的语法/逻辑问题:

MyProjectCollection.ProjectList.AddItem(MyProjectType)

MyProjectCollection是List(Of Project)类型,它本身并没有ProjectList属性!正确的操作流程应该是:
先创建Project实例 → 把ProjectType添加到该实例的ProjectList → 再将Project实例加入集合,代码如下:

Dim MyProjectCollection as New List(of Project)
Dim MyProjectType as New ProjectType
MyProjectType.Name = "Math"
' 先实例化一个Project对象
Dim targetProject as New Project()
targetProject.ProjectList.Add(MyProjectType) ' VB里集合添加元素用Add,不是AddItem
MyProjectCollection.Add(targetProject) ' 将Project实例加入到外层集合

2. Lambda表达式的属性访问错误

你的筛选代码里写了x.ProjectType.Name,但Project类的定义里根本没有ProjectType这个属性——只有ProjectList(一个List(Of ProjectType))。你要实现的是「保留那些ProjectList中包含Name为'Science'的ProjectType的Project」,所以Lambda里应该检查集合是否存在匹配项,而不是访问一个不存在的属性:

错误的筛选代码:

MyProjectCollection.RemoveAll(function(x as Project) x.ProjectType.Name <> "Science")

修正后的筛选代码:

MyProjectCollection.RemoveAll(Function(x As Project) 
    ' 逻辑:如果当前Project的ProjectList里找不到"Science"类型,就移除这个Project
    Not x.ProjectList.Any(Function(pt) pt.Name = "Science")
End Function)

这里用Any()方法判断集合中是否存在符合条件的元素,完全贴合你的需求。

3. 可选的健壮性优化

虽然你定义Project类时已经初始化了ProjectList(New List(Of ProjectType)),但如果后续代码不小心把ProjectList设为Nothing,或者某个ProjectType实例为Nothing,还是会触发空引用错误。可以加一层空检查让代码更安全:

MyProjectCollection.RemoveAll(Function(x As Project) 
    x.ProjectList Is Nothing OrElse Not x.ProjectList.Any(Function(pt) pt?.Name = "Science")
End Function)

这里的pt?.Name是空传播运算符,能避免个别ProjectType实例为空时的错误。


内容的提问来源于stack exchange,提问作者Stavros

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:39:04