使用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
相关产品推荐
相关产品推荐

