VB.Net查找字符串数组重复项的代码运行故障排查
结论
你提供的这段用于提取数组重复元素的VB.NET代码本身可正常运行,切换数组存储不会导致该段代码失效,故障点确实在其他代码段。
这段LINQ逻辑的执行不依赖具体的存储载体,只要传入的WithDuplicates是可枚举的字符串集合(包括String数组、List(Of String)等),就能正确完成以下操作:
- 按元素值对集合内容分组
- 筛选出出现次数大于1的分组(即存在重复的元素值)
- 提取每个重复值的第一个实例,最终转换为独立的重复元素数组
优先排查的故障点
针对你从RichTextBox切换到数组存储、涉及线程适配的场景,优先检查以下高频问题:
- 数组赋值时序问题:跨线程场景下容易出现工作线程执行去重逻辑时,UI线程还未完成RichTextBox内容到数组的写入,导致传入的
WithDuplicates是空数组或未完成初始化的空引用 - 线程访问合规性问题:如果直接在非UI线程读取RichTextBox内容填充数组,会触发线程安全访问异常,要确保数组内容是通过UI线程调度正确读取后再传递给工作线程
- 类型不匹配问题:从RichTextBox读取文本拆分生成数组时,要确认生成的是
String()类型数组,避免因元素类型不匹配导致LINQ方法执行报错 - 空值问题:检查数组元素是否存在
Nothing值,如果存在未处理的空值,分组逻辑可能出现非预期结果
鲁棒性优化方案
可以给现有去重逻辑增加空值保护,避免因上游数据异常导致该段代码报错,优化后代码如下:
' 增加空集合兜底,避免空引用异常 Dim duplicates As List(Of String) = If(WithDuplicates, Enumerable.Empty(Of String)()) _ .GroupBy(Function(n) n) _ .Where(Function(g) g.Count() > 1) _ .Select(Function(g) g.First()) _ .ToList() Dim DuplicatesOnly As String() = duplicates.ToArray()
优化后即使
WithDuplicates未初始化、为空集合,代码也会返回空的重复元素数组,不会直接抛出运行时异常。
内容的提问来源于stack exchange,提问作者Seeloewen
相关产品推荐
相关产品推荐

