VB.NET 嵌套类集合场景下校验输入字符串是否已存在的优化
解决方案
你可以借助.NET内置的LINQ扩展方法实现校验逻辑,不需要修改现有类结构,性能和原生嵌套循环完全一致,代码更简洁易读。
实现步骤
- 首先在
Form1.vb头部导入LINQ命名空间
Imports System.Linq
- 替换
Button1_Click中的嵌套循环逻辑即可,同时可以删掉冗余的全局变量the_new_String和TextBox1_TextChanged事件逻辑,直接取文本框值判断
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 摊平所有ClassA下的ClassB集合,直接判断是否存在匹配的Heading If allA.SelectMany(Function(a) a.allB).Any(Function(b) b.Heading = TextBox1.Text) Then MessageBox.Show($"Diesen Titel gibt es bereits.{NewLine}This title already exists.", "", MessageBoxButtons.OK, MessageBoxIcon.Information) Return End If ' 此处写校验通过后的后续逻辑 End Sub
方法说明
SelectMany(Function(a) a.allB):将嵌套的List(Of ClassA)中每个元素的allB集合合并为一个一维的ClassB序列,无需手动编写外层遍历逻辑Any(Function(b) b.Heading = 目标字符串):遍历合并后的序列,只要找到第一个匹配项就立即返回结果,不会多余遍历后续元素,和你原有嵌套循环的短路逻辑完全一致,没有额外性能开销- 如果需要忽略大小写校验,可以把判断条件改为
b.Heading.Equals(TextBox1.Text, StringComparison.OrdinalIgnoreCase)
高频校验场景优化方案
如果你的数据量很大、校验操作触发非常频繁,可以额外维护一个全局哈希集合存储所有已存在的Heading,判断时时间复杂度为O(1),比遍历方案效率更高:
- 在
FormMain类中新增全局变量
Private existedHeadings As New HashSet(Of String)
- 每次新增/删除
ClassB实例的时候,同步把对应的Heading添加/移除到existedHeadings中 - 校验时直接调用哈希集合的Contains方法即可
If existedHeadings.Contains(TextBox1.Text) Then
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

