2016-03-22 5 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

Возможные дубликата [VB.NET: Проверьте, если элементы списка равны и имеют одинаковое количество] (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 

Это предполагает, что песни1 тот же размер list2, что если песни1 4х4 то песни2 4х4

+0

Возможно, вам следует добавить ' Break' s, если 'areEqual' является ложным, чтобы предотвратить цикл до конца. –

+0

Что произойдет, если один из списков (внутренний или внешний) в 'list1' длиннее соответствующего списка в' list2'? –

+0

@ ZevSpitz youre right Исключение происходит – codemonkeyliketab

0

Я собираюсь сделать ряд предположений здесь, которые могут быть неправильно в вашем случае , Вам действительно нужно уточнить некоторые моменты о том, как это сравнение должно работать:

  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) 
Смежные вопросы