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

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),比遍历方案效率更高:

  1. 在FormMain类中新增全局变量
Private existedHeadings As New HashSet(Of String)
  1. 每次新增/删除ClassB实例的时候,同步把对应的Heading添加/移除到existedHeadings中
  2. 校验时直接调用哈希集合的Contains方法即可
If existedHeadings.Contains(TextBox1.Text) Then

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:39:04