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

VB.NET:检查列表项是否相等并具有相同的计数,vb.net,list,generics,comparison,Vb.net,List,Generics,Comparison,如何检测两个给定列表的项是否相等 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在第一个

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

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
在第一个列表中出现两次)。

如果您想知道两个列表是否包含相同的项,您可以使用
可枚举项。除了

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
或者,借助于:

请注意,这两种方法都将忽略重复项。因此,对于以下情况,它们将返回
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
bothContainSameItems=list1.Count=list2.Count
如果两者都包含相同的内容,则
Dim l1Ordered=list1.OrderBy(函数(i)i.ToList())
Dim l2Ordered=list2.OrderBy(函数(i)i.ToList())
对于i As Int32=0到L1。计数-1
如果l1订购(i)l2订购(i),则
bothContainSameItems=False
退出
如果结束
下一个
如果结束

如果您想知道两个列表是否包含相同的项目,您可以使用可枚举的
。除了

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
或者,借助于:

请注意,这两种方法都将忽略重复项。因此,对于以下情况,它们将返回
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
bothContainSameItems=list1.Count=list2.Count
如果两者都包含相同的内容,则
Dim l1Ordered=list1.OrderBy(函数(i)i.ToList())
Dim l2Ordered=list2.OrderBy(函数(i)i.ToList())
对于i As Int32=0到L1。计数-1
如果l1订购(i)l2订购(i),则
bothContainSameItems=False
退出
如果结束
下一个
如果结束
也使用

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),包含两个输入序列中的元素, 不包括重复项

还与

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),包含两个输入序列中的元素, 不包括重复项



循环浏览其中一个列表并检查另一个列表是否包含该元素。还要检查列表的长度是否相同。为什么要先“不排序”呢?听起来是个不错的选择。@SysDragon:听起来不错,是的,但是如果您想保持列表中的顺序呢?但这导致了我的最终实现,尽管:-)循环遍历其中一个列表并检查另一个列表是否包含该元素。还要检查列表的长度是否相同。为什么要先“不排序”呢?听起来是个不错的选择。@SysDragon:听起来不错,是的,但是如果您想保持列表中的顺序呢?但这导致了我的最终实现,尽管:-)反例:
list1={1,1,2,3}
list2={1,2,3}
@KonradRudolph:我已经添加了一个类似的示例。这取决于他是否要比较集合的要求。反例:
list1={1,1,2,3}
list2={1,2,3}
@KonradRudolph:我已经添加了一个类似的例子。这取决于他是否想要比较集合的要求。类似于我的方法:但是,如果集合很大,则效率不是很高。
SequenceEqual
与我的
For
-循环的作用相同,只要条件为
False
,两者都会立即中断。但是,这两种方法都是无效的,因为两个集合都必须复制到一个新集合中,并且两个集合都需要完全排序。如果两个列表都不存在会怎么样?没错,前两个检查的顺序需要切换;我更新了函数。类似于我的方法:但是,如果集合很大,则效率不是很高。
SequenceEqual
与我的
For
-循环的
相同,这两种方法在条件为
False
时都会中断。但是,这两种方法都是无效的,因为两个集合都必须复制到一个新集合中,并且两个集合都需要完全排序。如果两个列表都不存在会怎么样?没错,前两个检查的顺序需要切换;我更新了函数。这会更改第一个列表,并且不会考虑重复的列表。@Johannes我已经声明了工会更改列表的事实。为什么你认为当文档清楚地表明相反的情况时,不考虑重复的内容?至少在下载之前检查一下,文档中清楚地说明了这一点。检查这个例子:
{1,2,3}
{1,2,3,1}
,反之亦然。文档说:
排除重复项'so{1,2,3,4}union{1,2,3,5}返回{1,2,3,4,5},我的错误不是写入
list3=list1.union(list2)`因为唯一列表是union的返回值,而不是第一个列表。然而,你是对的,这不是你问题的正确答案,因为你仍然无法判断这两个列表是否不同(计数不是一种有效的方法)是的,但是
{1,2,3,1}。联合({1,2,3})
仍然是
{1,2,3,1}
:)这会更改第一个列表,并且不会考虑重复的列表。@Johannes我已经说明了工会更改列表的事实。为什么你认为当文档清楚地表明相反的情况时,不考虑重复的内容?至少在下载之前检查一下,文档中清楚地说明了这一点。检查这个例子:
{1,2,3}
{1,2,3,1}
,反之亦然。文档说:
排除重复项'so{1,2,3,4}union{1,2,3,5}返回{1,2,3,4,5},我的错误不是写入
list3=list1.union(list2)`因为唯一列表是union的返回值,而不是第一个列表。然而,你是对的,这不是你问题的正确答案,因为你仍然无法判断两个列表是否不同(并且计数不是有效的方法)是的,但是
{1,2,3,1}.Union({1,2