【问题标题】:Compare two Lists of Lists of String比较两个字符串列表列表
【发布时间】:2016-03-30 05:12:46
【问题描述】:

我想比较两个字符串列表列表:

Dim ListV1 = New List(Of List(Of String))
Dim ListV2 = New List(Of List(Of String))
Dim ListResult = New List(Of List(Of String))

Fil(ListV1)
Fil(ListV2) 
ListResult = ***Compare***( ListV1 ,ListV2 )

我可以使用什么代码来生成这种比较?

【问题讨论】:

标签: .net vb.net list


【解决方案1】:

我将在这里做一些假设,在你的情况下这可能是不正确的。你真的需要澄清一些关于这种比较应该如何工作的观点:

  1. 大概您想比较列表中的各个值;如果两个列表在同一位置包含相同的值,则应将它们视为相等,即使它们实际上是不同的列表对象。
  2. 由于您为两个维度都选择了List(而不是Hashset),我认为顺序很重要——{"a","b"} 不等于{"b","a"}
  3. 如果一个List(Of String) 比另一个长,则相应的结果列表将与更长的列表一样长,但会填充Nothing 值以表示差异。
  4. 从您选择的List(Of List(Of String)) 来存储结果,我将假设您希望返回在相应位置等效的值;非等效值将在相应的结果中显示Nothing
  5. 由于您使用的是 VB.NET,我假设您需要不区分大小写的比较。

我建议添加以下两种扩展方法:

Imports System.Runtime.CompilerServices
Module ListFunctions
    Public Function MaxLength(Of T)(l1 As List(Of T), l2 As List(Of T)) As T
        Dim l1Length = If(l1?.Count,0)
        Dim l2Length = If(l2?.Count,0)
        Return Math.Max(l1Length, l2Length)
    End Function
    <Extension()> Public Function TryGet(Of T)(l As List(Of T), idx As Integer) As T
        If If(l?.Count, 0) <= idx Then Return Nothing
        Return l(idx)
    End Function
End Module

然后,在您的代码块中:

Dim listComparer = Function(l1 As List(Of String), l2 As List(Of String))
        Return Enumerable.Range(0, MaxLength(l1,l2)).Select(Function(i)
                Dim s1 = l1.TryGet(i)
                Dim s2 = l2.TryGet(i)
                If s1 = s2 Then Return s1
                Return Nothing
            End Function).ToList
    End Function

Dim listsComparer = Function(ll1 As List(Of List(Of String)), ll2 As List(Of List(Of String)))
        Return Enumerable.Range(0, MaxLength(ll1,ll2)).Select(Function(i)
                Dim l1 = ll1.TryGet(i)
                Dim l2 = ll2.TryGet(i)
                Return listComparer(l1,l2)
            End Function).ToList
    End Function

Dim ListResult = listsComparer(ListV1, ListV2)

【讨论】:

    【解决方案2】:

    这是我能做的最好的假设,即比较含义等效值,并且如果子列表之间存在差异,则列表应该包含一个子列表的所有内容。

    Enum Side
        Left
        Right
    End Enum
    
    Function Compare2DLists(list1 As List(Of List(Of String)), list2 As List(Of List(Of String)), takeSide As Side) As List(Of List(Of String))
        Dim newList As New List(Of List(Of String))
    
        For i = 0 To list1.Count - 1
            Dim areEqual As Boolean = True
            For j = 0 To list1.Count - 1
                If Not list1(i)(j) = list2(i)(j) Then
                    areEqual = False
    
                End If
            Next
    
            If areEqual = False Then
                Select Case takeSide
                    Case Side.Left
                        newList.Add(list1(i))
    
                    Case Side.Right
                        newList.Add(list2(i))
                End Select
    
            Else
                newList.Add(list1(i))
            End If
        Next
    
        Return newList
    
    End Function
    

    这假设 list1 与 list2 的大小相同,因此如果 list1 是 4x4,则 list2 是 4x4

    【讨论】:

    • 如果areEqual 为假,也许你应该添加Breaks 以防止循环运行到最后。
    • 如果list1 中的列表之一(内部或外部)比list2 中的相应列表长,会发生什么情况?
    猜你喜欢
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多