首页 > 解决方案 > VB.NET比较2个不同长度的字符串列表以获得相同的匹配,列表将有重复的值,List1需要List2中的所有内容

问题描述

Vb.Net 检查 2 个不同长度的加扰字符串列表是否匹配相同的值,两个列表可能有重复的重复值,需要考虑这些值。List1 需要具有与 List2 中相同的值计数。两个列表都将始终具有值,并且 List1 将始终大于或等于 List2 的大小,永远不会小于 List2。

示例 = True - 因为 List2 调用了 F100 和 F200,而它们在 List1 中。
列表1 = (F100, F200, F300, F400)
列表 2 = (F100, F200)

Example = False - 因为 List1 没有 F200 的数量 2,它只有 F200 出现一次。
列表1 = (F100, F200, F300, F100)
列表 2 = (F100, F200, F200)

示例 = True - 因为 List1 的数量为 2,即 F100、F200 和 F300。List1 有额外的项目,这很好。
列表1 = (F300, F200, F100,F300, F200,F100, F400, F500, F600)
列表2 = (F100, F200, F300, F100, F200, F300)

如果 List1 没有与 List2 内的所有内容匹配,我希望将布尔值设置为 false。我的示例代码如下,但它不适用于重复值。

Dim lot_equal As Boolean = True
For Each difference In List2.Except(List1)
lot_equal = False
Next

标签: vb.netlinq

解决方案


可以用 LINQ 做到这一点

<Extension()>
Function IsIn(Of T)(list2 As List(Of T), list1 As List(Of T)) As Boolean

    Dim d1 = list1.GroupBy(Function(x) x).ToDictionary(Function(g) g.Key, Function(g) g.Count())
    Return list2.GroupBy(Function(x) x).All(Function(g) d1.ContainsKey(g.Key) AndAlso d1(g.Key) >= g.Count())

End Function

它是如何工作的?

将第一个列表变成字典,将一个数字映射到它出现的次数(因此List1 = (F100, F200, F300, F400)变成一个包含 4 个条目的字典,每个条目计数 1)

然后它按条目对第二个列表进行分组,并询问 a) 是否所有键都在第一个列表中,以及 b) 第一个列表的计数是否等于或大于第二个列表的计数。

也可以通过 Lookup 来完成:

<Extension()>
Function IsIn(Of T)(list2 As List(Of T), list1 As List(Of T)) As Boolean

    Dim lu = list1.ToLookup(Function(x) x)
    Return list2.GroupBy(Function(x) x).All(Function(g) lu(g.Key).Count >= g.Count())

End Function

..它有一个很好的工具,你不需要先查询键的存在——调用不存在的键查找会产生一个空序列。

..但它们比字典少见,所以它有点“嗯?这是做什么的?”

通过使其成为扩展,您可以以非常自然的方式调用它:

Dim result = list2.IsIn(list1)

推荐阅读