1

指定された 2 つのリストの項目が等しいかどうかを検出するにはどうすればよいですか?

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は最初のリストで2回発生します)。

4

3 に答える 3

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
于 2013-07-22T12:30:25.770 に答える
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
    ...
于 2013-07-22T13:09:32.747 に答える