如何检测两个给定列表中的项是否相等?
Dim list1 As New List(Of Integer)
list1.AddRange({1, 2, 3})
Dim list2 As New List(Of Integer)
list2.AddRange({3, 2, 1})
如果我使用SequenceEqual
比较它们,我会得到False
,因为商品的顺序不一样。我怎么能比较它们而不先排序呢?
编辑:请注意这应该尊重重复项,例如{1, 2, 3, 1}
与{1, 2, 3}
不同(项1
在第一个列表中出现两次)。
答案 0 :(得分: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
或在HashSet(Of T)
的帮助下:
Dim l1Set = New HashSet(Of Integer)(list1)
Dim l2Set = New HashSet(Of Integer)(list2)
bothContainSameItems = l1Set.SetEquals(l2Set)
请注意,这两种方法都会忽略重复项。因此,他们将返回equal
:
list1.AddRange({1, 1, 2, 3})
list2.AddRange({3, 2, 1, 3})
这里有一种方法可以检查两个列表中的所有数字是否都有相同的数量:
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
答案 1 :(得分:1)
同时使用
Dim list1 As New List(Of Integer)
list1.AddRange({1, 2, 3})
Dim list2 As New List(Of Integer)
list2.AddRange({3, 2, 1})
Dim list3 = list1.Union(list2)
if list3.OrderBy(Function(i) i).SequenceEqual(list1.OrderBy(Function(i) i)) then
Console.WriteLine("Equal")
else
Console.WriteLine("Not Equal")
end if
返回值:包含两个输入序列中元素的IEnumerable(Of T), 不包括重复。
答案 2 :(得分:0)
<System.Runtime.CompilerServices.Extension()> _
Function AreItemsEqual(Of T)(col1 As IEnumerable(Of T), col2 As IEnumerable(Of T)) As Boolean
' performance checks
If col1 Is col2 Then Return True
If col1 Is Nothing OrElse col2 Is Nothing Then Return False
If col1.Count <> col2.Count Then Return False
' compare their elements
Dim o1 As IEnumerable(Of T) = col1.OrderBy(Function(i) i)
Dim o2 As IEnumerable(Of T) = col2.OrderBy(Function(i) i)
Return o1.SequenceEqual(o2)
End Function
用法:
If list1.AreItemsEqual(list2) Then
...