2016-03-22 226 views
0

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

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) 

可以使用哪些代码来生成这种比较?

+1

可能重复:检查列表项是相等的,并具有相同的计数](http://stackoverflow.com/questions/17787538/vb-net-check-if-list-items-are-equal-and-have-same-count) – mikeyq6

回答

0

这是我可以做的最好的假设,比较含义等价值,并且列表应该包含所有子列表,如果在子列表之间存在差异。

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的是列表2的大小相同,例如,如果列表1为4x4然后列表2为4x4

+0

也许你应该添加' Break'如果'areEqual'为false则阻止循环直到结束。 –

+0

如果'list1'中的一个列表(内部或外部)比'list2'中的对应列表长,会发生什么? –

+0

@ZevSpitz你是对的,发生异常 – codemonkeyliketab

0

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

  1. 大概你想比较列表中的单个值;如果两个列表在同一位置包含相同的值,即使它们实际上是不同的列表对象,它们也应该被视为相等。
  2. 既然你选择了List这两个维度(而不是像​​)我认为这个顺序很重要 - {"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) 
[VB.NET的