VB.NET:检查List项是否相等并且具有相同的计数

jor*_*jor 1 vb.net generics comparison list

如何检测两个给定列表中的项是否相等?

Dim list1 As New List(Of Integer)
list1.AddRange({1, 2, 3})

Dim list2 As New List(Of Integer)
list2.AddRange({3, 2, 1})
Run Code Online (Sandbox Code Playgroud)

如果我使用SequenceEqual我得到它们,False因为项目的顺序不一样.但是如何在不先排序的情况下对它们进行比较呢?

编辑:请考虑到这应该尊重重复,例如{1, 2, 3, 1}不一样{1, 2, 3}(项目1在第一个列表中出现两次).

Tim*_*ter 5

如果您想知道两个列表是否包含相同的项目,您可以使用Enumerable.Except:

Dim bothContainSameItems As Boolean
If list1.Count > list2.Count Then
    bothContainSameItems = Not list1.Except(list2).Any()
Else
    bothContainSameItems = Not list2.Except(list1).Any()
End If
Run Code Online (Sandbox Code Playgroud)

或者,在以下帮助下HashSet(Of T):

Dim l1Set = New HashSet(Of Integer)(list1)
Dim l2Set = New HashSet(Of Integer)(list2)
bothContainSameItems = l1Set.SetEquals(l2Set)
Run Code Online (Sandbox Code Playgroud)

请注意,这两种方法都会忽略重复.所以他们会回来equal:

list1.AddRange({1, 1, 2, 3})
list2.AddRange({3, 2, 1, 3})
Run Code Online (Sandbox Code Playgroud)

这里有一种方法可以检查两个列表中的所有数字是否都具有相同的计数:

bothContainSameItems = list1.Count = list2.Count
If bothContainSameItems Then
    Dim l1Ordered = list1.OrderBy(Function(i) i).ToList()
    Dim l2Ordered = list2.OrderBy(Function(i) i).ToList()
    For i As Int32 = 0 To l1Ordered.Count - 1
        If l1Ordered(i) <> l2Ordered(i) Then
            bothContainSameItems = False
            Exit For
        End If
    Next
End If
Run Code Online (Sandbox Code Playgroud)

  • 反例:`list1 = {1,1,2,3}`,`list2 = {1,2,3}`. (2认同)