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

