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

VB.NET如何比较含重复值、长度不同的两个无序字符串列表的匹配性

VB.NET 带重复值的无序字符串列表匹配校验实现

实现逻辑

核心思路是分别统计两个列表中每个值的出现频次,再校验List2中所有值的出现频次都不高于List1中对应值的频次即可。

最优性能实现(推荐,大数据量场景下效率更高)

通过字典存储频次,仅需遍历两个列表各一次,时间复杂度为O(n+m)

' 校验方法:List1中每个值的出现次数不少于List2对应值返回True,否则返回False
Function CheckListMatch(List1 As List(Of String), List2 As List(Of String)) As Boolean
    ' 统计List1各值的出现次数
    Dim countDict1 = List1.GroupBy(Function(s) s).ToDictionary(Function(g) g.Key, Function(g) g.Count())
    ' 统计List2各值的出现次数
    Dim countDict2 = List2.GroupBy(Function(s) s).ToDictionary(Function(g) g.Key, Function(g) g.Count())
    
    For Each item In countDict2
        ' List1不存在对应值 或 出现次数不足,直接返回不匹配
        If Not countDict1.ContainsKey(item.Key) OrElse countDict1(item.Key) < item.Value Then
            Return False
        End If
    Next
    ' 所有校验项通过,返回匹配
    Return True
End Function

简洁写法(适合小数据量场景)

如果列表数据量不大,可以直接用LINQ单行实现,写法更简洁:

Dim lot_equal As Boolean = List2.GroupBy(Function(s) s).All(Function(g) List1.Count(Function(s) s = g.Key) >= g.Count())

原代码问题说明

你原来使用的Except方法仅会判断两个集合的唯一值差集,完全不统计值的出现次数,因此无法适配重复值的校验场景。

测试用例验证

' 示例1:返回True
Dim list1_1 = New List(Of String) From {"F100", "F200", "F300", "F400"}
Dim list2_1 = New List(Of String) From {"F100", "F200"}
Console.WriteLine(CheckListMatch(list1_1, list2_1))

' 示例2:返回False
Dim list1_2 = New List(Of String) From {"F100", "F200", "F300", "F100"}
Dim list2_2 = New List(Of String) From {"F100", "F200", "F200"}
Console.WriteLine(CheckListMatch(list1_2, list2_2))

' 示例3:返回True
Dim list1_3 = New List(Of String) From {"F300", "F200", "F100","F300", "F200","F100", "F400", "F500", "F600"}
Dim list2_3 = New List(Of String) From {"F100", "F200", "F300", "F100", "F200", "F300"}
Console.WriteLine(CheckListMatch(list1_3, list2_3))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 16:15:04